2009-02-10 43 views
23

Tôi đang cố gắng thực hiện SQL sau bằng LINQ và gần nhất tôi nhận được là thực hiện các phép nối chéo và tính tổng. Tôi biết có một cách tốt hơn để viết nó vì vậy tôi đang chuyển sang nhóm ngăn xếp để được trợ giúp.LINQ: Sử dụng INNER JOIN, Nhóm và SUM

SELECT T1.Column1, T1.Column2, SUM(T3.Column1) AS Amount 
FROM T1 
    INNER JOIN T2 
     ON T1.T1ID = T2.T1ID 
    INNER JOIN T3 
     ON T2.T3ID = T3.T3ID 
GROUP BY T1.Column1, T1.Column2 

Những gì tôi đã cố gắng như sau LINQ đang

var qTotal = from T2 in context.T2 
      from T3 in context.T3 
      where T3.T3ID == T3.T3ID 
      group T3 by T2.T1ID into gT2T3 
        from T1 in context.T1 
        where gT2T3.Key.Equals(T1.T1ID) 
        select new { T1.Column1,T1.Column2,Amount = gT2T3.Sum(t => t.Column1)}; 

Tôi biết đó có phải là một cách tốt hơn để viết nó, tôi chỉ không biết làm thế nào, bất kỳ trợ giúp sẽ là tuyệt vời!

Trả lời

29

Hãy thử điều này:

var total = from T1 in context.T1 
      join T2 in context.T2 on T1.T2ID equals T2.T2ID 
      join T3 in context.T3 on T2.T3ID equals T3.T3ID 
      group T3 by new { T1.Column1, T1.Column2 } into g 
      select new { 
       Column1 = T1.Column1, 
       Column2 = T2.Column2, 
       Amount = g.Sum(t3 => t3.Column1) 
      }; 
+1

Cảm ơn bạn Nick, tôi ban đầu nghĩ rằng câu trả lời là không chính xác nhưng sau khi đọc lại nó và thực hiện nó một lần nữa tôi nhận ra tôi đã có một sai lầm trong nỗ lực ban đầu của tôi và câu trả lời của bạn đã được phát hiện. cảm ơn bạn! – Nic

+4

Đối với phiên bản .NET mới hơn (4.0 trở đi?), Hãy xem câu trả lời của twnaing dưới đây. –

18

Đối với tôi (sử dụng 4.0), các công trình sau đây.

var total = from T1 in context.T1 
      join T2 in context.T2 on T1.T2ID equals T2.T2ID 
      join T3 in context.T3 on T2.T3ID equals T3.T3ID 
      group T3 by new { T1.Column1, T1.Column2 } into g 
      select new { 
       Column1 = g.Key.Column1, 
       Column2 = g.Key.Column2, 
       Amount = g.Sum(t3 => t3.Column1) 
      }; 
0

Dưới đây đang làm việc cho tôi:

      var credit = (from bm in BulkMessage 
          join sms in SMS on bm.BulkMessageId equals sms.BulkMessageId 
          where bm.ProfileId == pid && bm.IsActive == true 
          group sms by sms.SMSCredit into g 

          select new { SMSCredits = g.Sum(s => s.SMSCredit) }).FirstOrDefault();