2009-02-10 32 views
23

我正在尝试使用LINQ执行以下SQL,并且我得到的距离最近的是做交叉连接和总计算。我知道必须有更好的方式来编写它,所以我正在向堆栈团队寻求帮助。LINQ:使用INNER JOIN,组和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 

我一直在努力为以下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)}; 

我知道必须有把它写一个更好的办法,我只是不知道任何帮助将如何,是伟大的!

回答

29

试试这个:

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

谢谢尼克,我最初的想法,答案是不正确的,但重读它,并再次执行它,我意识到我在最初尝试了一个错误,你的答案是现货。谢谢! – Nic 2009-02-10 04:10:14

18

对我来说,(使用4.0),以下的作品。

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

下面的代码为我工作:

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