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

时间:2017-08-05 21:57:00

标签: c# linq-to-entities

我在我的程序中使用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 Van Onsem

1 个答案:

答案 0 :(得分:5)

=SUMPRODUCT((E:E=I2)*(F:F<=50),(G:G)) 使查询的余数在本地执行。早于AsEnumerable()的任何内容仍然是AsEnumerable()执行流程的一部分。例如,想一想(想象一个IQueryable属性):

Age

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

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

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