web-dev-qa-db-fra.com

comment convertir sql union en linq

J'ai la requête Transact SQL suivante à l'aide d'une union. J'ai besoin de quelques conseils pour savoir à quoi cela ressemblerait dans LINQ, c'est-à-dire que certains exemples seraient agréables ou si quelqu'un peut recommander un bon tutoriel sur UNIONS dans 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

Notez que le SQL d'origine est fusion les 2 sélections ne les concaténent pas. J'ai besoin de savoir comment fusionner les résultats, c'est-à-dire supprimer les doublons et additionner la valeur du montant des lignes en cas de duplication basée sur le code à barres.

28
lowlyintern

Trois concepts Linq utiles fonctionnant sur des décors. Étant donné l'ensemble c et l'ensemble e:

Concat vous donne tout dans c ou 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 vous donne également tout dans c et e, mais supprime tous les doublons:

(From c In db.Customers _
        Select c.Country).Union(From e In db.Employees _
        Select e.Country)

Sauf vous donne tout dans c qui n'est pas dans e:

(From c In db.Customers _
             Select c.Country).Except(From e In db.Employees Select e.Country)
36
Amit Rai Sharma

Voici un exemple d'union générique, sans égard au scénario que vous avez publié:

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

Il y a 101 échantillons Linq - avec deux échantillons d'union nion1 et nion2

Cette instruction Linq devrait vous obtenir les mêmes résultats que votre SQL: (elle a pour moi sur un jeu d'enregistrements de test)

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)
                });
5
Nicholas Murray