скажем, то, что у меня есть таблица под названием Объекты (идентификационный интервал, Сделанный интервал, Общий интервал)
Я могу сделать это двумя запросами:
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...?
Используя поддержку языка кортежей, представленных в C# 7.0, можно решить это использование следующего выражения LINQ:
var itemSums = m.Items.Aggregate((Total: 0, Done: 0), (sums, item) => (sums.Total + item.Total, sums.Done + item.Done));
Полный пример кода:
var m = new
{
Items = new[]
{
new { Total = 10, Done = 1 },
new { Total = 10, Done = 1 },
new { Total = 10, Done = 1 },
new { Total = 10, Done = 1 },
new { Total = 10, Done = 1 },
},
};
var itemSums = m.Items.Aggregate((Total: 0, Done: 0), (sums, item) => (sums.Total + item.Total, sums.Done + item.Done));
Console.WriteLine($"Sum of Total: {itemSums.Total}, Sum of Done: {itemSums.Done}");