2009-02-10 10 views
23

Ich versuche, die folgende SQL mit LINQ durchzuführen, und die nächste, die ich bekam, war Cross-Joins und Summenberechnungen. Ich weiß, dass es einen besseren Weg geben muss, es zu schreiben, also wende ich mich an das Stack-Team um Hilfe.LINQ: Verwendung von INNER JOIN, Group und 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 

Was ich versucht haben, ist die folgende LINQ-Code

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)}; 

Ich weiß, dass es einen besseren Weg zu sein hat, es zu schreiben, ich weiß nur nicht, wie jede Hilfe wäre toll!

Antwort

29

Versuchen Sie folgendes:

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

Sie Nick Vielen Anfänglicher Ich dachte, die Antwort falsch war, aber nachdem es rereading und es wieder Durchführung erkannte ich, ich habe einen Fehler in meinem ersten Versuch hatte und Ihre Antwort war genau richtig. Danke! – Nic

+4

Für neuere .NET-Versionen (4.0 und höher?), Werfen Sie einen Blick auf die Antwort von thnaing unten. –

18

Für mich (mit 4,0), die folgenden Werke.

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

Below-Code ist für mich arbeiten:

      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();