为什么Entity Framework选择内存聚合而不是sql?

时间:2016-08-10 11:10:17

标签: entity-framework entity-framework-6

我从这个问题开始:

var results = 
    context.Set<Record>()
        .GroupBy(r => r.Number)
        .Select(g => new { g.Key, Count = g.Count() })
        .ToList();

虽然重构我将此查询提取到方法中,因此GroupBy接受委托。此更改导致聚合现在在内存中执行。

这种行为是否符合设计要求?我刚刚失去了在SQL中聚合的好处。

以下是内存中聚合的示例:

Func<Record, int> func = r => r.Number;
var results = 
    context.Set<Record>()
        .GroupBy(func)
        .Select(g => new { g.Key, Count = g.Count() })
        .ToList();

2 个答案:

答案 0 :(得分:2)

请注意IQueryable和IEnumerable之间的区别。

查看@internal

中投票最多的答案

主要区别在于IQueryable保留表达式和将在其上执行表达式的Provider。如果您希望查询由提供程序执行(可能在SQL中),那么您必须确保结果对象是IQueryable。

但是,提供商不了解您的代表。这些代表不在您的提供商上,而是在本地内存中。因此,提供商不知道如何做到这一点,因此必须在本地完成。

What is the difference between IQueryable and IEnumerable帮助我了解使用IQueryables时会发生什么

答案 1 :(得分:0)

非常简单地将Func<Record, int> func更改为Expression<Func<Record, int>> func解决了我的问题。