2009-02-10 4 views
23

J'essaie d'exécuter le code SQL suivant à l'aide de LINQ et le plus proche que j'ai obtenu consistait à effectuer des jointures croisées et des calculs de somme. Je sais qu'il doit y avoir une meilleure façon de l'écrire, alors je me tourne vers l'équipe de la pile pour obtenir de l'aide.LINQ: Utilisation de INNER JOIN, Group et 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 

Ce que j'ai essayé est le code LINQ suivant

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

Je sais qu'il doit y avoir une meilleure façon de l'écrire, je ne sais pas comment, toute aide serait génial!

Répondre

29

Essayez ceci:

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

Merci Nick, j'INITIAL pensais que la réponse était erronée, mais après la relecture et l'exécuter à nouveau je réalisé que j'avais une erreur dans ma première tentative et votre réponse était sur place. Je vous remercie! – Nic

+4

Pour les nouvelles versions .NET (4.0 et suivantes?), Jetez un coup d'œil à la réponse twnaing ci-dessous. –

18

Pour moi (en utilisant 4,0), les travaux suivants.

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

Ci-dessous code fonctionne pour moi: vous

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