将IQueryable linq查询转换为IEnumerable 取消linq优化的工作方式?

我在.NET上有点新手,我想知道linq是如何工作的,因为你可以一个接一个地使用许多linq查询,但是在它们用于传输信息或转换为列表之前,它们都没有真正执行,等等
有两种重要的方法来获取linq查询,使用IQueryable ,它直接在Sql上使用wherefilter,IEnumerable获取所有记录,然后在内存中使用它们。 但是,让我们来看看这段代码:

  //Linq dynamic library IQueryable myResult = db.Categories .Where(a => a.Name.Contains(StringName)) .OrderBy("Name") .Skip(0) .Take(10); if (myResult != null) { return myResult.AsEnumerable(); } else { return null; }

我正在使用Linq动态库,这个查询的直接结果是获取IQueryable ,如果查询最终被返回为IEnumerable ,是否真的在sql上过滤了查询? 还是在记忆中?

它仍然会在数据库中执行,不用担心。 基本上都是使用Where等的实现。 当你在IQueryable上调用方法时 – 通过Queryable扩展方法 – 它将使用表达式树。 当您开始从该查询中获取时 ,它将变为SQL并发送到数据库。

另一方面,如果在将它作为IEnumerable (就编译时类型而言) 之后使用任何这些方法,那将使用Enumerable的扩展方法,以及其余的所有方法处理在进行中完成。

举个例子,考虑一下:

 var query = db.People .Where(x => x.Name.StartsWith("J")) .AsEnumerable() .Where(x => x.Age > 20); 

这里AsEnumerable() 返回其输入序列,但输入为IEnumerable 。 在这种情况下,数据库查询将仅返回名称以J开头的人 – 然后年龄过滤将在客户端完成。

如果返回IEnumerable然后进一步细化查询,则进一步细化将在内存中进行。 在IQueryable上表达的部分将被转换为适当的SQL语句(显然,对于LINQ-to-SQL情况)。

请参阅返回IEnumerable 与IQueryable 以获得更长且更详细的答案。