2009-02-10 49 views
23

Estoy tratando de realizar el siguiente SQL usando LINQ y lo más parecido que conseguí fue haciendo combinaciones cruzadas y cálculos de suma. Sé que tiene que haber una mejor manera de escribirlo, así que recurro al equipo de pila para pedir ayuda.LINQ: Usando INNER JOIN, Group y 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 

Lo que he intentado es el siguiente código de LINQ

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

Sé que tiene que haber una mejor manera de escribirlo, simplemente no saben cómo, cualquier ayuda sería grande!

Respuesta

29

Prueba esto:

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

Gracias Nick, iniciales pensé que la respuesta era incorrecta pero después de releerlo y realizar de nuevo me di cuenta que tenía un error en mi primer intento y tu respuesta fue perfecta. ¡gracias! – Nic

+4

Para las versiones .NET más nuevas (4.0 en adelante?), Eche un vistazo a la respuesta de twnaing a continuación. –

18

Para mí (usando 4.0), las siguientes obras.

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

A continuación código está trabajando para mí:

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