скажем, то, что у меня есть таблица под названием Объекты (идентификационный интервал, Сделанный интервал, Общий интервал)
Я могу сделать это двумя запросами:
int total = m.Items.Sum(p=>p.Total)
int done = m.Items.Sum(p=>p.Done)
Но я хотел бы сделать это в одном запросе, чем-то вроде этого:
var x = from p in m.Items select new { Sum(p.Total), Sum(p.Done)};
Конечно, существует способ вызвать агрегатные функции от синтаксиса LINQ...?
Это поможет:
from p in m.Items
group p by 1 into g
select new
{
SumTotal = g.Sum(x => x.Total),
SumDone = g.Sum(x => x.Done)
};
С помощью вспомогательного класса кортежа, собственного или - в .NET 4 - стандартных, вы можете сделать следующее:
var init = Tuple.Create(0, 0);
var res = m.Items.Aggregate(init, (t,v) => Tuple.Create(t.Item1 + v.Total, t.Item2 + v.Done));
И res .Item1
- это сумма столбца Total
и res.Item2
столбца Done
.
Как насчет
m.Items.Select(item => new { Total = item.Total, Done = item.Done })
.Aggregate((t1, t2) => new { Total = t1.Total + t2.Total, Done = t1.Done + t2.Done });