为什么AsEnumerable也在服务器上执行过滤器



我在程序中使用 Linq to Entities,我有以下两个简单的查询:

var result = dbContext.Customers.Where(c => c.Name == "Mostafa").ToList();
var result2 = dbContext.Customers.Where(c => c.Name == "Mostafa").AsEnumerable().ToList();

当我运行 SQL 事件探查器时,我发现生成的 SQL 查询对于两个查询都是相同的! 问题是为什么在第二个查询中,虽然我使用 asEnumerable,但在服务器端执行过滤?

更新: 将第二个查询更改为如下所示时,筛选应用于内存而不是服务器:

var result2 = dbContext.Customers.AsEnumerable().Where(c => c.Name == "Mostafa").ToList();

感谢@Willem范昂森

AsEnumerable()使查询的其余部分在本地执行。早于AsEnumerable()的任何内容仍然是IQueryable执行流的一部分。例如,考虑一下(想象一个Age属性(:

var result = dbContext.Customers
.Where(c => c.Name == "Mostafa")
.Where(c => c.Age == 18)
.ToList();

这将导致按名称和年龄过滤的 SQL。与此相比:

var result = dbContext.Customers
.Where(c => c.Name == "Mostafa")
.AsEnumerable()
.Where(c => c.Age == 18)
.ToList();

这将在 SQL 中按名称进行过滤,但它会在本地(在内存中(按年龄进行过滤。

最新更新