将IQueryable转换为IEnumerable会再次执行查询吗?

Adr*_*bra 14 c# linq

在我的查询中我需要返回, 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)