2010-04-30 14 views
19

J'ai la requête Transact SQL suivante en utilisant une union. J'ai besoin de quelques pointeurs sur la façon dont cela ressemblerait dans LINQ, par exemple, quelques exemples seraient agréables ou si quelqu'un peut recommander un bon tutoriel sur UNIONS in linq.comment convertir union sql en 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 le SQL d'origine est fusion 2 sélectionne pas les concaténer. Je dois savoir comment fusionner les résultats, c'est-à-dire supprimer les doublons et additionner la valeur du montant des lignes lorsqu'il y a duplication en fonction du code à barres.

+0

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

+0

Il suffit d'utiliser l'opérateur Union comme @ Ian-P suggéré – Guillaume86

Répondre

30

Trois concepts Linq utiles fonctionnant sur des ensembles. Ensemble donné c et mis e:

Concat vous donne tout 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 c et e, mais supprime 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) 
+24

'Concat',' Union' et 'Except' sont des choses différentes:' Concat' fusionnera deux séquences en une, 'Union' fusionnera mais supprimera les doublons (distinct), et' Except' est complètement différent: il retourne les éléments de la première séquence qui n'appartiennent pas à la seconde séquence. (le dernier est 'Intersect': retourne les éléments communs à partir de 2 séquences) – Guillaume86

+0

Comme Guillaume86 l'a mentionné, ce post est incorrect. Un petit changement de formulation réglerait facilement le problème. – Griffin

+0

Je pense qu'il vaut la peine de noter que, comme 'Union',' Except' et 'Interset' suppriment également tous les doublons, y compris les doublons dans les séquences source. – NetMage

4

Il y a les 101 Linq Samples - avec deux échantillons syndicaux Union1 et Union2

Cette déclaration LINQ devrait vous obtenir les mêmes résultats que votre SQL: (il a pour moi un enregistrement ensemble 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) 
       }); 
10

Voici un exemple d'une union générique, sans tenir compte du scénario que vous avez posté:

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