EF 延迟加载

////1.立即查询
//var list = context.Books.Where(b => b.BookID > 3).ToList();

////区分开:集合中的where是System.Linq.Enumerable里给IEnumerable接口添加的扩展方法
////而context.Books.Where 来自于System.Linq.Queryable中的IQueryable扩展的方法
//List<string> strs = new List<string>();

//strs.Where(b=>true);

//2.延迟加载 的本质是在System.Linq.Queryable类中为IQueryable添加扩展方法而实现的
// 延迟加载的本质原因:当前可能通过多个标准查询条件 那么每个方法都只是添加一个查询条件而已,无法确定本次查询条件
// 是否已经添加完毕,因此, 没有办法在每个查询条件后的sql语句是什么,只能返回一个包含了所有查询条件的DBQuery对象
// 当使用这个DBQuery对象的时候,才能根据所有的条件生成sql语句,此时再查询数据库
System.Data.Entity.Infrastructure.DbQuery<Book> list2 = context.Books.Where(b => b.BookName == "mnvc")
.OrderBy(b=>b.BookName)
as System.Data.Entity.Infrastructure.DbQuery<Book>;

//2.延迟加载--针对外键实体的延迟
// 本质:对于外键属性而言,EF会在用到这个外键属性的时候才执行插叙查询语句
//var user = context.Users.Where(u => u.UserId == 5);//此时返回的是DBQuery对象,以接口的形式返回

//var ousr = user.FirstOrDefault();//此时只是查询的user表中的数据

//var article = ousr.Articles.FirstOrDefault().Name;//此时只是查询article表中的数据

//3.延迟加载的缺点:每次使用外键属性的时候,都会查询数据库
//var user = context.Users.Where(u => true);
//foreach (var item in user)
//{
// Console.WriteLine("用户:"+item.Name+" "+item.Articles.FirstOrDefault().Name);
//}

//此时应该是用连接查询
var user = context.Users.Include("Articles");
//通过include方法,可以告诉EF 连接查询 哪个外键属性,就是生成一条查询数据
//备注:可以使用多个include属性
foreach (var item in user)
{
Console.WriteLine("用户:" + item.Name + " " + item.Articles.FirstOrDefault().Name);
}

时间: 2024-08-04 03:43:45

EF 延迟加载的相关文章

ASP.NET Mvc开发之EF延迟加载

EF延迟加载:就是使用Lamabda表达式或者Linq 从 EF实体对象中查询数据时,EF并不是直接将数据查询出来,而是在用到具体数据的时候才会加载到内存. 一,实体对象的Where方法返回一个什么对象? 代码分析一下: region 查询文章列表+ActionResult Article() /// <summary> /// 查询文章列表 /// </summary> /// <returns></returns> public ActionResult

EF延迟加载

延迟加载: 需要加载数据时才去读取数据(多用于foreach循环加载数据) 优点:提高读取速度,避免获取不需要的数据 缺点:多次与DB交互,会降低性能 方法:a.在需要延迟加载的属性前加vitual关键字: b.在context类的构造方法中设置LazyLoadingEnabled属性为true

asp.net EF学习系列----深入理解查询延迟加载技术

ado.net EF是微软的一个ORM框架,使用过EF的同学都知道EF有一个延迟加载的技术. 如果你是一个老鸟,你可能了解一些,如果下面的学习过程中哪些方面讲解的不对,欢迎批评指教.如果一个菜鸟,那我们就一起开始今天的学习. 首先,提出以下几个问题. 何为延迟加载呢? 我们该如何使用呢? 我们为什么要使用延迟加载技术呢? 延迟加载技术有什么优.缺点呢? 好,带着上面的问题我们开始今天的学习. 1.何为延迟加载 EF的延迟加载,就是使用Lambda表达式或者Linq 从 EF实体对象中查询数据时,

EF使用延迟加载的本质原因

原文出处:http://m.blog.csdn.net/blog/qq1010885678/38238265 [原]EF使用延迟加载的本质原因 2014-7-28阅读368 评论0 EF(Entity Framework)是微软的一个ORM框架 使用过EF的同学都知道它有一个延迟加载的功能 那么这个延迟加载的功能到底是什么? 为什么需要延迟加载? 使用延迟加载的优点和缺点又各是什么? 可以通过一个简单的小例子来阐述EF的这些问题 首先使用到了两个很简单的数据表 关系图如下: T_Product的

学习EF之贪懒加载和延迟加载(2)

通过昨天对EF贪婪加载和延迟加载的学习,不难发现,延迟加载还是很好用的,但是问题也就来了,有的时候我们只需要加载一个实体,不需要和他相关的外部实体,这时候我们来看看EF延迟加载时怎么作用的吧 打开profiler 在Main函数入口处写一个查询,在Console.Read();处打一个断点 static void Main(string[] args) { var context = new EFDbContext(); var user = context.Users.FirstOrDefau

EF5.X Code First表关联与延迟加载

1-指定导航属性,会自动生成外键,命名规则为:“表名_主键名”2-默认情况下与导航属性的主键名称相同的字段会自动被标记为外键3-通过[ForeignKey]标记指定实体类的属性为外键,4-方式2的升级版,与导航属性的主键名称相同的字段会自动被标记为外键,然后指定字段对应的数据库中的列名 案例: 组织架构n : 1[组织用户关联]1 :n用户 using System; /** * 作者:陈杰 * 时间:2012-08-10 00:25 * 功能:公共字段接口 **/ namespace Eleg

分享一个递归无限级拼接Json的方法---ExtJs的TreePanel和TreeGrid均适用(Ef,Lambda,Linq,IQueryable,List)

话不多说,先上实体类,如果你不是codefirst,就把它当成数据表结构. 下面是底层BaseDal获取数据的方法  (如果你没有Base类,直接写在你的DAL层和BLL层) 下面是BaseService的方法 下面方法用于拼接字符串 主体方法-- 1 /// <summary> 2 /// 得到树TreePanel的Json 3 /// </summary> 4 /// <returns></returns> 5 public string GetAllL

关于EF查询的性能

现象:前台grid发送ajax请求,通过谷歌devtool发现“waiting”时间高达23s(1500条数据);可见服务器端代码处理花费时间很长: 解决:分析代码,有两处代码注释掉后速度提升明显 1 //第一处,查询所有考试成绩:1500条 2 var data = _scoreResultService.GetAllKenScoreResults().ToList(); 3 //去掉ToList()后查询时间减少明显(3s); 4 5 //第二处; 6 foreach (var item i

ef entity转json引起的Self referencing loop

问题简介:前段时间做项目时,将取到的entity往Redis cache里存放时报多重引用的错误. Self referencing loop detected for property 'CheckItemCategory' with type. 一.问题详情 1.chectItemCategory与CheckItem实体介绍 2.我们用ef取了List<CheckItemCategory>,以Json的形式存放到redis中.但在JsonConvert.SerializeObject时报多