2010-04-30 2 views
19

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

+0

http://msdn.microsoft.com/ru-ru/library/bb386979.aspx – Andrey

+0

просто используйте оператор Союза как предложенный @ Ian-P – Guillaume86

ответ

30

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

'Concat',' Union' и 'Except' - это разные вещи:' Concat' просто объединяет две последовательности в один, «Союз» будет сливаться, но удалять дубликаты (разные), а «Исключить» - совсем другое: он возвращает элементы первой последовательности, которые не принадлежат ко второй последовательности. (последним является 'Intersect': возвращает общие элементы из 2 последовательностей) – Guillaume86

+0

Как упоминал Guillaume86, это сообщение неверно. Небольшое изменение формулировки легко устранит проблему. – Griffin

+0

Я думаю, что стоит отметить, что, например, 'Union',' Except' и 'Interset' также удаляют любые дубликаты, включая дубликаты в исходных последовательностях. – NetMage

4

Есть в 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) 
       }); 
10

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

var something = 
       (from e in _repository 
       select new { e.Property1, e.Property2 }).Union(
       (from e in _repository 
       select new { e.Property1, e.Property2 })); 
Смежные вопросы