как конвертировать sql union в linq

У меня есть следующий запрос Transact SQL с использованием объединения. Мне нужно несколько советов о том, как это будет выглядеть в 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 выбирает НЕ объединяя их. Мне нужно знать, как объединить результаты, т.е. удалить дубликаты и суммировать значение суммы строк, где есть дублирование на основе штрих-кода.


person lowlyintern    schedule 30.04.2010    source источник
comment
msdn.microsoft.com/en-us/library/bb386979.aspx   -  person Andrey    schedule 30.04.2010
comment
просто используйте оператор Union, как предложил @Ian-P   -  person Guillaume86    schedule 08.05.2012


Ответы (3)


Три полезные концепции 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)

Union также дает вам все в 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)
person Amit Rai Sharma    schedule 30.04.2010
comment
Concat, Union и Except разные вещи: Concat просто объединит две последовательности в одну, Union объединит, но удалит дубликаты (различные), а Except совсем другое: вернет элементы первой последовательности, не принадлежащие второй последовательности . (последний Intersect: возвращает общие элементы из 2 последовательностей) - person Guillaume86; 08.05.2012
comment
Как упомянул Guillaume86, этот пост неверен. Небольшое изменение формулировки легко устранило бы проблему. - person Griffin; 21.10.2013
comment
Я думаю, стоит отметить, что, как и Union, Except и Interset, также удаляются любые дубликаты, в том числе дубликаты в исходных последовательностях. - person NetMage; 25.04.2017

Вот пример общего союза, независимо от опубликованного вами сценария:

var something =
                (from e in _repository
                 select new { e.Property1, e.Property2 }).Union(
                (from e in _repository
                 select new { e.Property1, e.Property2 }));
person Ian P    schedule 30.04.2010

Существует 101 образец Linq — с двумя образцами объединения 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)
                });
person Nicholas Murray    schedule 30.04.2010