Подтвердить что ты не робот

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

4b9b3361

Ответ 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)
                });