DbContext、DbSet及DbQuery是Entity Framework Code First引入的3个新的类,其中DbContext用于保持数据库会话连接,实体变化跟踪及保存,DbSet用于暂存实体类的变化跟踪,DbQuery用于提供查询跟你。

  1、使用Set查询全部记录

  使用DbContext查询首先需要保证DbContext的实例在使用完之后对资源的释放,释放DbContext实例资源的方法有两种:采用using代码块结构和调用DbContext实例的Dispose()方法。

using (var ctx = new PortalContext())
{
foreach (var province in ctx.Provinces)
{
Console.WriteLine(province.ProvinceName);
}
}
using (var ctx = new PortalContext())
{
foreach (var province in ctx.Set<Province>())
{
Console.WriteLine(province.ProvinceName);
}
}

  2、使用LINQ排序、筛选等

  1>、LINQ排序

  LINQ表达式排序:

using (var ctx = new PortalContext())
{
var provinces = from p in ctx.Provinces
orderby p.ProvinceNo
select p;
foreach (var province in provinces)
{
Console.WriteLine(province.ProvinceName);
}
}

  LINQ表达式多字段排序:

using (var ctx = new PortalContext())
{
var provinces = from p in ctx.Provinces
orderby p.ProvinceNo descending, p.ProvinceName ascending
select p;
foreach (var province in provinces)
{
Console.WriteLine(province.ProvinceName);
}
}

  LINQ扩展方法排序:

using (var ctx = new PortalContext())
{
var provinces = ctx.Provinces
.OrderBy(p => p.ProvinceNo); foreach (var province in provinces)
{
Console.WriteLine(province.ProvinceName);
}
}

  LINQ扩展方法多字段排序:

var provinces = ctx.Provinces
.OrderByDescending(p => p.ProvinceNo)
.ThenBy(p => p.ProvinceName); foreach (var province in provinces)
{
Console.WriteLine(province.ProvinceName);
}

  注:在采用LINQ扩展方法进行多字段排序时,多出现多个OrderBy,则只按最后一个OrderBy字段进行排序。

  如下示例只会按照ProvinceName进行升序排序:

var provinces = ctx.Provinces
.OrderByDescending(p => p.ProvinceNo)
.OrderBy(p => p.ProvinceName);

  2>、LINQ筛选

  LINQ表达式筛选:

using (var ctx = new PortalContext())
{
var cities = from c in ctx.Cities
where c.ProvinceID ==
select c; foreach (var city in cities)
{
Console.WriteLine(city.CityName);
}
}

  LINQ表达式多字段筛选:

using (var ctx = new PortalContext())
{
var cities = from c in ctx.Cities
where c.ProvinceID == && c.CityID >
select c; foreach (var city in cities)
{
Console.WriteLine(city.CityName);
}
}

  LINQ表达式筛选与排序:

using (var ctx = new PortalContext())
{
var cities = from c in ctx.Cities
where c.ProvinceID == && c.CityID >
orderby c.CityID
select c; foreach (var city in cities)
{
Console.WriteLine(city.CityName);
}
}

  LINQ扩展方法筛选:

using (var ctx = new PortalContext())
{
var cities = ctx.Cities
.Where(c => c.ProvinceID == ); foreach (var city in cities)
{
Console.WriteLine(city.CityName);
}
}

  LINQ扩展方法多字段筛选:

using (var ctx = new PortalContext())
{
var cities = ctx.Cities
.Where(c => c.ProvinceID == && c.ProvinceID > ); foreach (var city in cities)
{
Console.WriteLine(city.CityName);
}
}

  LINQ扩展方法多字段筛选及排序:

var cities = ctx.Cities
.Where(c => c.ProvinceID == && c.ProvinceID > )
.OrderBy(c=>c.CityID);

  3>、LINQ选择读取字段

  LINQ表达式读取1个字段:

var cities = from c in ctx.Cities
where c.ProvinceID == && c.CityID >
select c.CityName;

  LINQ表达式读取多个字段:

var cities = from c in ctx.Cities
where c.ProvinceID == && c.CityID >
select new { c.CityID, c.CityName };

  LINQ扩展方法读取1个字段:

using (var ctx = new PortalContext())
{
var citieNames = ctx.Cities
.Where(c => c.ProvinceID == && c.ProvinceID > )
.OrderBy(c => c.CityID)
.Select(c => c.CityName); foreach (var cityName in citieNames)
{
Console.WriteLine(cityName);
}
}

  LINQ扩展方法读取多个字段:

using (var ctx = new PortalContext())
{
var cities = ctx.Cities
.Where(c => c.ProvinceID == && c.ProvinceID > )
.OrderBy(c => c.CityID)
.Select(c => new { c.CityID, c.CityName }); foreach (var c in cities)
{
Console.WriteLine("{0}-{1}", c.CityID, c.CityName);
}
}

  3、查询本地数据

  Entity Framework Code First通过DbSet的Local属性查询本地数据,查询本地数据的使用情况:1>当需要查询的数据已经存在与内存中,而不想再次发送SQL语句到数据库中取查询;2>当最新的数据还只在内存中而未提交到数据库的情况对内存数据进行查询。

  示例:初始时本地未加载内存数据

using (var ctx = new PortalContext())
{
var count = ctx.Cities.Local.Count;
Console.WriteLine("Cities in memory:{0}", count);
}

  执行后返回的结果:

  Cities in memory:0

  示例:先通过查询,将数据加载到内存

using (var ctx = new PortalContext())
{
foreach (var city in ctx.Cities)
{
Console.WriteLine(city.CityName);
} var count = ctx.Cities.Local.Count;
Console.WriteLine("Cities in memory:{0}", count);
}

  执行后返回的结果:

  ......

  Cities in memory:342

  3.2>、使用Load方法将数据加载到内存

using (var ctx = new PortalContext())
{
ctx.Cities.Load();
var count = ctx.Cities.Local.Count;
Console.WriteLine("Cities in memory:{0}", count);
}

  执行后的结果:

  Cities in memory:342

using (var ctx = new PortalContext())
{
var expr = from c in ctx.Cities
select c;
expr.Load();
var count = ctx.Cities.Local.Count;
Console.WriteLine("Cities in memory:{0}", count);
}

  3.2>、基于本地数据进行查询

using (var ctx = new PortalContext())
{
ctx.Cities.Load();
var cities = from c in ctx.Cities.Local
orderby c.ProvinceID
select c;
foreach (var city in cities)
{
Console.WriteLine("{0}", city.CityName);
}
}

  清除内存数据:

ctx.Cities.Local.Clear();

  4、查询单个对象

  DbContext API可以使用DbSet.Find来查询返回单个对象,DbSet.Find接受的参数值为需要查询的主键值,若未找到符合条件的主键值则返回null。

  Find查找单个对象的规则:

  1>、从内存中查找已经存在的从数据库中加载出来的实体或已经被附加到DbContext的实体;

  2>、查找新添加的但还未被提交保存到数据库中的实体对象;

  3>、到数据库中取查找还未加载到内存中的实体对象。

using (var ctx = new PortalContext())
{
var city = ctx.Cities.Find(); if (city != null)
{
Console.WriteLine(city.CityName);
}
else
{
Console.WriteLine("City not found!");
}
}

  若实体类具有多个主键,则Find方法同样接受全部主键的参数值,参数的顺序必须与主键列的顺序相同。

var city = ctx.Cities.Find(keyID, cityID);

  Single方法也可以用于查询后返回单个对象:

using (var ctx = new PortalContext())
{
var expr = from c in ctx.Cities
where c.CityID ==
select c; var city = expr.Single();
}

  SingleOrDefault方法查询返回单个对象:

using (var ctx = new PortalContext())
{
var expr = from c in ctx.Cities
where c.CityID ==
select c;
var city = expr.SingleOrDefault();
if (city != null)
{
Console.WriteLine(city.CityName);
}
else
{
Console.WriteLine("City not found!");
}
}

  Single与SingleOrDefault方法的区别在于:当不存在满足条件的单个实体时,Single将直接抛出异常,而SingleOrDefault则返回class类型的默认值null。

Entity Framework Code First使用DbContext查询的更多相关文章

  1. Entity Framework Code First学习系列目录

    Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...

  2. Entity Framework Code First学习系列

    Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...

  3. Entity Framework Code First实体对象变动跟踪

    Entity Framework Code First通过DbContext.ChangeTracker对实体对象的变动进行跟踪,实现跟踪的方式有两种:变动跟踪快照和变动跟踪代理. 变动跟踪快照:前面 ...

  4. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  5. Entity Framework Code First执行SQL语句、视图及存储过程

    1.Entity Framework Code First查询视图 Entity Framework Code First目前还没有特别针对View操作的方法,但对于可更新的视图,可以采用与Table ...

  6. Entity Framework Code First主外键关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  7. 使用 Entity Framework Code First

    使用 Entity Framework Code First 在家闲着也是闲着,继续写我的[ASP.NET MVC 小牛之路]系列吧.在该系列的上一篇博文中,在显示书本信息列表的时候,我们是在程序代码 ...

  8. Entity Framework Code First实现乐观并发

    Entity Framework Code First实现乐观并发 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: h ...

  9. Entity Framework Code first(转载)

    一.Entity Framework Code first(代码优先)使用过程 1.1Entity Framework 代码优先简介 不得不提Entity Framework Code First这个 ...

随机推荐

  1. WindowManager massge和handler

    在一个可移动浮动按钮的demo源码学习中,有一些WindowManager的使用,在此做下总结. 1.翻译过来就是窗口管理,是和应用框架层的窗口管理器交互的接口,通过 mWindowManager = ...

  2. 软件工程:vs单元测试

    vs单元测试?VS?没装呢... 那么赶紧装个吧,于是跑到这去了: http://www.msdn.hk 我下个免费社区版. 安装过程没有什么需要说明的,傻瓜式安装会吗?当然中间会耗很长时间. 由于以 ...

  3. Redis安装配置(Windows版)

    近期项目中引入Redis,故记录下来,方便日后查看. 可参考(http://www.cnblogs.com/happyday56/p/3916388.html)不说废话,直奔主题. 一.安装前的准备: ...

  4. ESLint 规则

    ESLint由 JavaScript 红宝书 作者 Nicholas C.Zakas 编写, 2013 年发布第一个版本. ESLint是一个以可扩展.每条规则独立的,被设计为完全可配置的lint工具 ...

  5. java排序学习笔记

    前面写了js的排序实现,总得玩玩java的哈. 同样,冒泡.选择.快速(这三个之前实现过也写过文章).堆排序,然后做比较. 主要遇到的难点: - -||想轻松点写个封装计时的逻辑,不想每调用一个排序就 ...

  6. ORM数据层框架的设计热点:更新指定的列的几种设计方案

    ORM框架的定义:对象-关系映射(Object/Relation Mapping,简称ORM) 常见的是:数据库结构=>映射Object(实体属性)=>基于实体类的操作. 还有一种:数据库 ...

  7. eventbus 备注

    Event在整个系统中是单例的. EventBus.getDefault().register(this); 注册 EventBus.getDefault().unregister(this); 注销 ...

  8. 基于zookeeper实现统一资源管理

    分布式系统中经常涉及到配置资源的管理,比如,一个应用系统需要部署在多台服务器上,但是他们拥有某些的配置项是相同的,如果配置变更,需要修改这些配置,那么需要同时修改每台服务器,这样做比较麻烦而且容易出错 ...

  9. ASP.Net请求处理机制初步探索之旅 - Part 4 WebForm页面生命周期

    开篇:上一篇我们了解了所谓的请求处理管道,在众多的事件中微软开放了19个重要的事件给我们,我们可以注入一些自定义的业务逻辑实现应用的个性化设计.本篇,我们来看看WebForm模式下的页面生命周期. ( ...

  10. Some practices to write better C#/.NET code(译)

    C#(.NET)中有关编码的一些建议,原文地址:http://www.codeproject.com/Articles/539179/Some-practices-to-write-better-Cs ...