为什么 AsEnumerable 也在服务器上执行过滤器
Why AsEnumerable also execute filter on server
我在我的程序中使用 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 Profiler 时,我发现生成的 SQL 查询对于两个查询都是相同的!
问题是为什么在第二个查询中,虽然我使用的是 asEnumerable,但在服务器端执行过滤?
更新:
将第二个查询更改为如下所示时,过滤应用于内存而不是服务器:
var result2 = dbContext.Customers.AsEnumerable().Where(c => c.Name == "Mostafa").ToList();
感谢@Willem Van Onsem
AsEnumerable()
使查询的 remainder 在本地执行。 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 中按姓名过滤,但会在本地(内存中)按年龄过滤。
我在我的程序中使用 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 Profiler 时,我发现生成的 SQL 查询对于两个查询都是相同的! 问题是为什么在第二个查询中,虽然我使用的是 asEnumerable,但在服务器端执行过滤?
更新: 将第二个查询更改为如下所示时,过滤应用于内存而不是服务器:
var result2 = dbContext.Customers.AsEnumerable().Where(c => c.Name == "Mostafa").ToList();
感谢@Willem Van Onsem
AsEnumerable()
使查询的 remainder 在本地执行。 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 中按姓名过滤,但会在本地(内存中)按年龄过滤。