2010-04-30 35 views
19

Tôi có truy vấn SQL Giao dịch sau đây bằng cách sử dụng một liên kết. Tôi cần một số gợi ý về việc làm thế nào điều này sẽ xem xét trong LINQ ví dụ một số ví dụ sẽ tốt đẹp hoặc nếu bất cứ ai có thể đề nghị một hướng dẫn tốt về UNIONS trong LINQ.cách chuyển đổi liên kết sql sang 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 

Lưu ý SQL gốc là sáp nhập 2 chọn KHÔNG concatenating chúng. Tôi cần biết cách hợp nhất các kết quả tức là loại bỏ các bản sao và tổng hợp các giá trị số lượng hàng có sự trùng lặp dựa trên mã vạch.

+0

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

+0

chỉ cần sử dụng toán tử Union làm @ Ian-P đề xuất – Guillaume86

Trả lời

30

Ba khái niệm LINQ hữu ích hoạt động trên các bộ. Với thiết c và thiết lập e:

concat cung cấp cho bạn tất cả mọi thứ trong c hoặ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ũng cung cấp cho bạn tất cả mọi thứ trong ce, nhưng loại bỏ bất kỳ bản sao:

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

Trừ cung cấp cho bạn mọi thứ trong c không có trong e:

(From c In db.Customers _ 
      Select c.Country).Except(From e In db.Employees Select e.Country) 
+24

'Concat',' Union' và 'except' là những thứ khác nhau:' Concat' sẽ hợp nhất hai chuỗi thành một, 'Union' sẽ hợp nhất nhưng loại bỏ trùng lặp (khác biệt) và' except' hoàn toàn khác: nó trả về các phần tử của chuỗi đầu tiên không thuộc chuỗi thứ hai. (Cái cuối cùng là 'Giao nhau': trả về các phần tử phổ biến từ 2 chuỗi) – Guillaume86

+0

Như Guillaume86 đã đề cập, bài đăng này không chính xác. Một chút thay đổi từ ngữ sẽ dễ dàng khắc phục vấn đề. – Griffin

+0

Tôi nghĩ rằng cần lưu ý rằng như 'Union',' except' và 'Interset' cũng loại bỏ bất kỳ bản sao nào, kể cả các bản sao trong chuỗi nguồn. – NetMage

4

Có những 101 Linq Samples - với hai mẫu công đoàn Union1Union2

tuyên bố LINQ này nên giúp bạn có được kết quả tương tự như SQL của bạn: (nó có cho tôi trên một thử nghiệm kỷ lục bộ)

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

Dưới đây là một ví dụ về một liên minh chung chung, mà không quan tâm đến kịch bản mà bạn đã đăng:

var something = 
       (from e in _repository 
       select new { e.Property1, e.Property2 }).Union(
       (from e in _repository 
       select new { e.Property1, e.Property2 })); 
Các vấn đề liên quan