EF里的Where,和普通的Where有什么不同??

lovingkiss 2019-08-09 11:43:28
实体.AsNoTracking().AsExpandable().Where(predicate).AsNoTracking().ToList();



实体数据.Where(predicate).ToList();

1、EF是先执行的筛选,再到数据库获取数据对吗?
2、而普通的Where,是先要有内存数据,才能筛选,是这样子吗?

...全文
580 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2019-08-09
  • 打赏
  • 举报
回复
其实这个问题就是 IEnumerable和IQuerable的区别了吧。 那么在讨论ef的where和普通的where时,就要区分了。 首先普通的where,在使用时,由于数据已经在本地缓存。所以直接操作的是对象。 而ef在没有tolist()或者take,find....等等之前。是IQuerable的, 此时的where只是拼接了表达式树expression。 而如果tolist()之后,就和普通where没有区别了。
听雨停了 2019-08-09
  • 打赏
  • 举报
回复
好像不是你说的这样。首先where不是ef里面的,它是Linq里面的。是IEnumerable的一个拓展方法。你说的普通的where,指的是什么呢,如果是说自己写的where筛选方法的话。linq做到的就是可以延迟查询。其实自己手动写的where拓展方法也是可以实现延迟查询功能的。实体数据.Where(predicate).ToList();并不是先执行筛选,这个最后都会转成带where条件的sql语句再去执行的。
正怒月神 2019-08-09
  • 打赏
  • 举报
回复
引用 4 楼 lovingkiss 的回复:
在读取数据方面上,是先读取全部再做的筛选,还是根据条件去数据库端获取的数据呢??
这个是有先后次序的吧?EF刚开始用,不太清楚

使用ef,尽量是采用IQueryable的方式来读取.
也就是说先拼接生成了sql语句,然后去数据库查找,而不是直接直接全部读取到本地在筛选。
你可以这么认为
db.User.where(x=>id==1).ToList(); 这个是拼接了where后的sql然后去执行
db.User.ToList().where(x=>id==1); 这个是把数据全部加载到本地,然后在内存里where筛选。


  • 打赏
  • 举报
回复
where就是只是一个指令,真正执行ToList或foreach之类要读写数据的时候,才会将sql发送到数据库进行操作 IQueryable查下就知道了
lovingkiss 2019-08-09
  • 打赏
  • 举报
回复
引用 2 楼 正怒月神 的回复:
其实这个问题就是
IEnumerable和IQuerable的区别了吧。
那么在讨论ef的where和普通的where时,就要区分了。
首先普通的where,在使用时,由于数据已经在本地缓存。所以直接操作的是对象。
而ef在没有tolist()或者take,find....等等之前。是IQuerable的,
此时的where只是拼接了表达式树expression。
而如果tolist()之后,就和普通where没有区别了。


在读取数据方面上,是先读取全部再做的筛选,还是根据条件去数据库端获取的数据呢??
这个是有先后次序的吧?EF刚开始用,不太清楚
YiYanXiYin 2019-08-09
  • 打赏
  • 举报
回复
如果楼主说的普通的where是指objectToLinq里面的where,那应该是对的

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧