Linq-группировка по нескольким таблицам
использование Linq to Sql как сгруппировать следующие 2 таблицы.
Стол Заказов:
CustomerID | Name |Date
1 | order1 | 2010-01-01
2 | order2 | 2010-01-01
2 | order3 | 2010-04-01
Вызовы Таблице:
CustomerID | Name |Date
1 | call1 | 2010-01-01
3 | call2 | 2010-06-01
2 | call3 | 2010-05-01
Я хочу сгруппировать две таблицы по дате,результат:
Date | Orders | Calls
2010-01-01 | 2 | 1
2010-04-01 | 1 | 0
2010-05-01 | 0 | 1
2010-06-01 | 0 | 1
Я знаю, как сгруппировать одну таблицу,
from o in Orders
group o by o.Date.Date into og
select new {Date = og.Key,Orders= og.Count()};
как группа? thx!
2 ответов
поскольку обе таблицы, похоже, имеют аналогичную структуру, я бы рекомендовал проецировать их в эквивалентную форму, а затем группировать по конкатенации этих двух наборов.
var orders = from o in Orders
select new { IsOrder = true, o.Date };
var calls = from c in Calls
select new { IsOrder = false, c.Date };
var result = from x in orders.Concat(calls)
group x by x.Date into og
select new {Date = og.Key, Orders= og.Count(o=>o.IsOrder), Calls = og.Count(c=>!c.IsTrue)};
из-за ленивой природы Linq2Sql это может быть фактически сведено к одному запросу. В интересах производительности я бы убедился, что это не запрос из ада.
вы можете использовать метод объединение:
var result =
(from c in Calls group c by c.Date into cg select new {Date = cg.Key, Calls = cg.Count(), Orders = 0})
.Union(from o in Orders group o by o.Date into og select new {Date = og.Key, Calls = 0, Orders = og.Count()})
.GroupBy(x => x.Date)
.Select(g => new {Date = g.Key, Calls = g.Max(r => r.Calls), Orders = g.Max(r => r.Orders)});
foreach (var row in result)
{
Trace.WriteLine(row);
}
Это очень похоже на SQL, который вы бы написали (объединение двух таблиц, а затем внешний запрос для объединения результатов в строку)