Entity Framework Code First使用DbContext查询
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查询的更多相关文章
- Entity Framework Code First学习系列目录
Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...
- Entity Framework Code First学习系列
Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...
- Entity Framework Code First实体对象变动跟踪
Entity Framework Code First通过DbContext.ChangeTracker对实体对象的变动进行跟踪,实现跟踪的方式有两种:变动跟踪快照和变动跟踪代理. 变动跟踪快照:前面 ...
- Entity Framework Code First关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- Entity Framework Code First执行SQL语句、视图及存储过程
1.Entity Framework Code First查询视图 Entity Framework Code First目前还没有特别针对View操作的方法,但对于可更新的视图,可以采用与Table ...
- Entity Framework Code First主外键关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- 使用 Entity Framework Code First
使用 Entity Framework Code First 在家闲着也是闲着,继续写我的[ASP.NET MVC 小牛之路]系列吧.在该系列的上一篇博文中,在显示书本信息列表的时候,我们是在程序代码 ...
- Entity Framework Code First实现乐观并发
Entity Framework Code First实现乐观并发 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: h ...
- Entity Framework Code first(转载)
一.Entity Framework Code first(代码优先)使用过程 1.1Entity Framework 代码优先简介 不得不提Entity Framework Code First这个 ...
随机推荐
- php安装程序
php安装程序 制作原理和步骤 检查目录或文件权限 修改或者添加配置文件 检查配置文件的正确性 导入数据库 锁定或删除安装文件 用到函数 iswritable("data/config.ph ...
- nginx:文件下载指定保存文件名的配置
一般在我们上传完资源文件之后,为了避免文件名冲突,会将文件名改成毫无意义的一段字符.这个字符,可能是MD5产生的,或者是其他方式产生的字符串.这时候,下载的时候,默认保存的文件名会是这段毫无意义的文件 ...
- Ant环境变量配置
Ant环境变量配置 1.新建系统变量ANT_HOME 变量名: ANT_HOME 变量值: D:\biancheng\apache-ant-1.7.1 2.修改PATH 变量值最后面 ...
- Python模块之day4
模块,代码归类实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能 ...
- 日常工作bug总结
1.在使用jQuery的text()与val()使用时,如果按钮是<button></button>的形式使用text()写入时,在IE8下会出现延迟,即我在写定时器5秒倒计时 ...
- SQL编程篇 (二) 定义与流程控制
分类: sql编程:标准的sql 编程 * 纯sql 在标准的编程中又分为 sqlserver-->T-sql oracle-->pl-sql(扩展) 变量:在使用变量之前先定义 声明变量 ...
- syntax error near unexpected token‘(
用虚拟机的时候出现这样的: 上网查了资料之后,在括号"( " 前加上"$"字符就暂时不会提示出错了.
- SharePoint 2010中一些必须知道的限制
最大文件名长度是123个字符. 一个文档库(library)里最多可以存放10000个文档 一个视图(view)里最多显示5000个条目(item) 推荐的单个内容数据库(content databa ...
- 谈asch系统的共识机制与容错性
本文章出自:http://blog.asch.so/,转载请注明出处. 0 前言 我曾分析了DPOS算法的漏洞并且模拟了一个简单的攻击的方法,然后实现了一个简化的PBFT算法模型试图去修复该漏洞,并且 ...
- 解读ASP.NET 5 & MVC6系列(3):项目发布与部署
本章我们将讲解ASP.NET5项目发布部署相关的内容,示例项目以我们前一章创建的BookStore项目为例. 发布前的设置 由于新版ASP.NET5支持多版本DNX运行环境的发布和部署,所以在部署之前 ...