在我的查询中,我需要返回IEnumerable
,但我不知道这个动作是否会使查询再次执行?var data = Repository<Person>.Find().AsEnumerable();
Find()
返回IQueryable
,因为IQueryable
继承了IEnumerable
。我怀疑AsEnumerable
是否重复执行。
我知道var data = Repository<Person>.Find().ToList()
执行了两次查询,一次是Find()
,第二次是Tolist()
3条答案
按热度按时间ijxebb2r1#
一个
IQueryable
* 就是一个IEnumerable
。没有转换,因此没有任何工作在进行。当您显式地或通过调用
foreach
调用GetEnumerator()
时,工作就会发生。还有,你确认
Repository.Find().ToList()
调用SQL两次了吗?我觉得这听起来不太对。mrwjdhj32#
AsEnumerable
实际上除了将as
操作符应用于IQueryable
之外没有做任何事情。因此,任何将来应用于对象的方法都将使用System.Linq.Enumerable
扩展方法集,而不是System.Linq.Queryable
方法。这都是关于延迟执行的。在你尝试枚举之前,没有任何东西会对你的可查询源(大概是数据库)执行。
换句话说就是:
字符串
如果您的代码:
型
执行了两次查询,这是因为你在Find()方法中做了一些不正确的事情,这绝对不应该是这种情况。
型
应该执行查询零次。
型
kqlmhetl3#
把linq看作是一个“Stream”,而聚合函数是一个“Flush”。“linq to db”流只能刷新一次。. AsEclock(),.Where(),....是一种准备查询的方法。ToList(),.First(),.Max()是一个聚合函数,但如果你不调用聚合函数,那么你的linq结果就不会运行。它只有在被枚举时才开始工作。
ex
字符串
这里什么都不会发生
1聚合被调用
型
或2个结果正在枚举
型
为了回答你的问题- .Find(),. AsEscape()不是聚合函数