假设你有下面的SQL语句:
select sum(A), max(B), avg(C) from TBL group by D
试试这个在C# :
from t in table
group t by D
into g
select new {
s = g.Sum(x => x.A),
m = g.Max(x => x.B),
a = g.Average(x => x.C)
}
- 或VB: -
from t in TBL
group t by key = D
into g = group
select s = g.Sum(function(x) x.A),
m = g.Max(function(x) x.B),
a = g.Average(function(x) x.C)
明显,这在VB是:
aggregate t in TBL into s = Sum(t.A), m = Max(t.B), a = Average(t.C)
虽然它可以得到同样的结果,它有一个因为它发出多个SQL select语句,每个聚合函数一个,也就是说它会以多次传递运行。第一种语法提供了一个单一的(相当复杂但高效的)SQL语句,它对数据库执行一次传递。
PS。如果你没有钥匙,通过该组由(即你需要一个单列的结果,覆盖整个数据集),使用常量为:
from t in TBL
group t by key = 0
into g = group
select s = g.Sum(function(x) x.A),
m = g.Max(function(x) x.B),
a = g.Average(function(x) x.C)
+1有趣的问题,我没有亲自看过它,但如果它不起作用,它会很奇怪。你不能使用'let'语法吗? – 2010-12-13 17:53:05
@Thomas,据我所见,不可能使用'let'来分配一个集合,而只是集合中某个项目的一个值。我一直在使用EF几个月,今天很惊讶地发现这个障碍。我真的不认为这是可能的! – 2010-12-13 18:08:10
@猎人的删除答案作品。你试过了吗?另外,'let'确实可以和集合一起工作。你尝试过吗?我有两个产品代码。 – 2010-12-15 18:14:45