我从这个问题开始:
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();
答案 0 :(得分:2)
请注意IQueryable和IEnumerable之间的区别。
中投票最多的答案主要区别在于IQueryable保留表达式和将在其上执行表达式的Provider。如果您希望查询由提供程序执行(可能在SQL中),那么您必须确保结果对象是IQueryable。
但是,提供商不了解您的代表。这些代表不在您的提供商上,而是在本地内存中。因此,提供商不知道如何做到这一点,因此必须在本地完成。
What is the difference between IQueryable and IEnumerable帮助我了解使用IQueryables时会发生什么
答案 1 :(得分:0)
非常简单地将Func<Record, int> func
更改为Expression<Func<Record, int>> func
解决了我的问题。