2010-04-30 13 views
19

में कनवर्ट करने के लिए मेरे पास एक यूनियन का उपयोग कर निम्न ट्रांज़ेक्ट SQL क्वेरी है। मुझे कुछ पॉइंटर्स चाहिए कि यह LINQ i.e में कुछ उदाहरणों को कैसे देखेंगे अच्छा होगा या अगर कोई linq में यूनियनों पर एक अच्छा ट्यूटोरियल सुझा सकता है।एसक्यूएल यूनियन को 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/en-us/library/bb386979.aspx – Andrey

+0

बस यूनियन ऑपरेटर का उपयोग @ इयान-पी के रूप में – Guillaume86

उत्तर

30

सेट पर चलने वाली तीन उपयोगी लिंक अवधारणाएं। यह देखते हुए 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' सिर्फ दो अनुक्रमों को एक में विलय करेगा, 'संघ' विलय करेगा लेकिन डुप्लीकेट (विशिष्ट) को हटा देगा, और 'छोड़कर' पूरी तरह से अलग है: यह पहले अनुक्रम के तत्वों को वापस करता है जो दूसरे अनुक्रम से संबंधित नहीं हैं। (अंतिम वाला 'छेड़छाड़' है: 2 तत्वों से सामान्य तत्व लौटाता है) – Guillaume86

+0

जैसा कि Guillaume86 ने उल्लेख किया है, यह पोस्ट गलत है। थोड़ा शब्द बदलने से समस्या आसानी से ठीक हो जाएगी। – Griffin

+0

मुझे लगता है कि यह ध्यान देने योग्य है कि 'संघ', 'निकालें' और 'इंटरसेट' जैसे स्रोत अनुक्रमों में डुप्लिकेट समेत किसी भी डुप्लीकेट को हटा दें। – NetMage

4

101 Linq Samples रहे हैं - दो के साथ संघ के नमूने Union1 और Union2

यह Linq बयान आप अपने एसक्यूएल रूप में एक ही परिणाम प्राप्त करना चाहिए: (यह एक परीक्षण रिकॉर्ड सेट पर मेरे लिए है)

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 })); 
संबंधित मुद्दे