Как преобразовать sql union в linq
У меня есть следующий запрос Transact SQL с использованием union.
Мне нужны некоторые указатели относительно того, как это будет выглядеть в LINQ. Некоторые примеры
было бы хорошо или если кто-то может порекомендовать хороший учебник по UNIONS в linq.
select top 10 Barcode, sum(ItemDiscountUnion.AmountTaken) from
(SELECT d.Barcode,SUM(AmountTaken) AmountTaken
FROM [Aggregation].[dbo].[DiscountPromotion] d
GROUP BY d.Barcode
UNION ALL
SELECT i.Barcode,SUM(AmountTaken) AmountTaken
FROM [Aggregation].[dbo].ItemSaleTransaction i
group by i.Barcode) ItemDiscountUnion
group by Barcode
Обратите внимание, что исходный SQL объединяет 2 выбирает NOT, конкатенируя их.
Мне нужно знать, как объединить результаты, то есть удалять дубликаты и суммировать значение суммы строк, где есть дублирование на основе штрих-кода.
Ответы
Ответ 1
Три полезных понятия Linq, работающие на наборах. При заданном наборе c
и установите e
:
Concat дает вам все в c
или e
:
(From c In db.Customers Select c.Phone).Concat( _
From c In db.Customers Select c.Fax).Concat( _
From e In db.Employees Select e.HomePhone)
(From c In db.Customers _
Select Name = c.CompanyName, Phone = c.Phone).Concat(From e In db.Employees _
Select Name = e.FirstName & " " & e.LastName, Phone = e.HomePhone)
Союз также дает вам все в c
и e
, но удаляет любые дубликаты:
(From c In db.Customers _
Select c.Country).Union(From e In db.Employees _
Select e.Country)
Кроме всего прочего в c
, который не находится в e
:
(From c In db.Customers _
Select c.Country).Except(From e In db.Employees Select e.Country)
Ответ 2
Вот пример общего объединения, независимо от сценария, который вы опубликовали:
var something =
(from e in _repository
select new { e.Property1, e.Property2 }).Union(
(from e in _repository
select new { e.Property1, e.Property2 }));
Ответ 3
Есть 101 Linq Samples - с двумя примерами объединения Union1 и Union2
Этот оператор Linq должен получить те же результаты, что и ваш SQL:
(он имеет для меня тестовый набор записей)
var results = (from a in (from d in DiscountPromotions
group d by d.BarCode into g
select new {
BarCode = g.Key,
AmountTaken = g.Sum(p => p.AmountTaken)
}).Union(from i in ItemSaleTransactions
group i by i.BarCode into o
select new {
BarCode = o.Key,
AmountTaken = o.Sum(i => i.AmountTaken)
}) group a by a.BarCode into b
select new {
BarCode = b.Key,
AmountTaken = b.Sum(c => c.AmountTaken)
});