linq 将IQueryable转换为IEQuery是否会再次执行查询?

qhhrdooz  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(100)

在我的查询中,我需要返回IEnumerable,但我不知道这个动作是否会使查询再次执行?
var data = Repository<Person>.Find().AsEnumerable();
Find()返回IQueryable,因为IQueryable继承了IEnumerable。我怀疑AsEnumerable是否重复执行。
我知道var data = Repository<Person>.Find().ToList()执行了两次查询,一次是Find(),第二次是Tolist()

ijxebb2r

ijxebb2r1#

一个IQueryable * 就是一个IEnumerable。没有转换,因此没有任何工作在进行。
当您显式地或通过调用foreach调用GetEnumerator()时,工作就会发生。
还有,你确认Repository.Find().ToList()调用SQL两次了吗?我觉得这听起来不太对。

mrwjdhj3

mrwjdhj32#

AsEnumerable实际上除了将as操作符应用于IQueryable之外没有做任何事情。因此,任何将来应用于对象的方法都将使用System.Linq.Enumerable扩展方法集,而不是System.Linq.Queryable方法。
这都是关于延迟执行的。在你尝试枚举之前,没有任何东西会对你的可查询源(大概是数据库)执行。
换句话说就是:

var data=Repository.Find().AsEnumerable() 
/* The query is only actually performed AFTER here */  
.ToList();

字符串
如果您的代码:

var data=Repository.Find().ToList();


执行了两次查询,这是因为你在Find()方法中做了一些不正确的事情,这绝对不应该是这种情况。

var data = Respository.Find();


应该执行查询零次。

var result = data.ToList(); // THIS is what should execute the query.

kqlmhetl

kqlmhetl3#

把linq看作是一个“Stream”,而聚合函数是一个“Flush”。“linq to db”流只能刷新一次。. AsEclock(),.Where(),....是一种准备查询的方法。ToList(),.First(),.Max()是一个聚合函数,但如果你不调用聚合函数,那么你的linq结果就不会运行。它只有在被枚举时才开始工作。
ex

var result = users.Select(usr => usr.Name);

字符串
这里什么都不会发生
1聚合被调用

result.First()


或2个结果正在枚举

result.ToList().ForEach(...)


为了回答你的问题- .Find(),. AsEscape()不是聚合函数

相关问题