как конвертировать sql union в linq - PullRequest
26 голосов
/ 30 апреля 2010

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

Ответы [ 3 ]

36 голосов
/ 30 апреля 2010

Три полезных понятия 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)
12 голосов
/ 30 апреля 2010

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

var something =
                (from e in _repository
                 select new { e.Property1, e.Property2 }).Union(
                (from e in _repository
                 select new { e.Property1, e.Property2 }));
5 голосов
/ 30 апреля 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)
                });
...