在我的查询中我需要返回, IEnumerable但我不知道这个动作是否使查询再次执行?
var data = Repository<Person>.Find().AsEnumerable();
Find()返回IQueryable,因为IQueryable继承IEnumerable.我怀疑是否AsEnumerable重复执行.
我知道
var data = Repository<Person>.Find().ToList()两次执行查询.一对一Find()和二Tolist()
Mar*_*tos 21
IQueryable 是一个IEnumerable.没有转换,因此没有任何工作.
当您GetEnumerator()通过显式或通过调用来调用时,工作就会发生foreach.
另外,你确认Repository.Find().ToList()调用SQL两次吗?这对我来说听起来不对.
Jef*_*eff 11
AsEnumerable除了将as运算符应用于IQueryable 之外,实际上并没有做任何事情.因此,您应用于对象的任何未来方法都将使用System.Linq.Enumerable扩展方法集,而不是System.Linq.Queryable方法.
这都是关于延期执行的.在您尝试枚举之前,没有任何东西会对您的可查询源(可能是数据库)执行任何操作.
换一种说法:
var data=Repository.Find().AsEnumerable()
/* The query is only actually performed AFTER here */
.ToList();
Run Code Online (Sandbox Code Playgroud)
如果您的代码:
var data=Repository.Find().ToList();
Run Code Online (Sandbox Code Playgroud)
执行查询两次,这是因为你在Find()方法中做了一些不正确的事情,绝对不应该这样.
var data = Respository.Find();
Run Code Online (Sandbox Code Playgroud)
应执行查询ZERO次.
var result = data.ToList(); // THIS is what should execute the query.
Run Code Online (Sandbox Code Playgroud)