我是 .NET 的新手,我想知道 linq 是如何工作的,因为您可以一个接一个地应用许多 linq 查询,但在用于传输信息或转换之前,它们都不会真正执行列出等
使用 IQueryable<T>
有两种获取 linq 查询的重要方法,它直接在 Sql 上应用 where 过滤器,而 IEnumerable 获取所有记录,然后在内存中与它们一起使用。但是,让我们看一下这段代码:
//Linq dynamic library
IQueryable<Table> 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<T>
上获取,如果查询最终返回为 IEnumerable
,查询真的在sql上被过滤了吗?还是在内存中?
最佳答案
它仍然会在数据库中执行,不用担心。基本上都取决于 Where
的实现。等被使用。当您在 IQueryable<T>
上调用方法时- 通过 Queryable
扩展方法——它将使用表达式树。当您开始从该查询中获取时,它将变成 SQL 并发送到数据库。
另一方面,如果您在 之后使用这些方法中的任何一种,您将得到它作为 IEnumerable<T>
(就编译时类型而言),这将使用 Enumerable
中的扩展方法,所有其余处理将在进程内完成。
举个例子,考虑一下:
var query = db.People
.Where(x => x.Name.StartsWith("J"))
.AsEnumerable()
.Where(x => x.Age > 20);
在这里AsEnumerable()
只是 返回其输入序列,但输入为 IEnumerable<T>
.在这种情况下,数据库查询将只返回姓名以 J
开头的人。 - 然后年龄过滤将在客户端完成。
关于c# - 将 IQueryable linq 查询转换为 IEnumerable<T> 会取消 linq 优化的工作方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14842176/