2010-11-17 78 views
0

任何人都可以帮我一个LINQ查询。我已经转换的大部分,但我必须在存储过程中的子查询,我无法弄清楚如何做到这一点..LINQ与子选择查询使用sum和group by?

基本上这是旧的存储过程(截断为便于)

SELECT M.Period AS 'Period' , 
      C.Code AS 'Group' , 
      C.ClientCode AS 'Code' , 
      C.ClientName AS 'Name' , 
      (SELECT SUM(Amount) AS Expr1 
       FROM  M 
       WHERE  (ClientCode = C.ClientCode) 
       GROUP BY ClientCode 
      ) AS 'Amount' , 

你可以从子查询上面看到的是,像这样

   SELECT SUM(Amount) AS Expr1 
       FROM  M 
       WHERE  (ClientCode = C.ClientCode) 
       GROUP BY ClientCode 
      ) AS 'Amount' 

所以我已经做了我所有的连接和我有这个迄今为止,它的工作原理。

var test = from c in C join h in H on c.Code 
      equals h.Code join m in M on c.ClientCode 
      equals m.ClientCode 
      select new 
      { 
       Period=m.Period, 
       Group=c.Code, 
       Code= c.ClientCode, 
       Name= c.ClientName, 
       <-- Here is where i need the sub select query above --> 
      }; 

但我在如何做子查询的损失。您可以在旧的存储过程中看到该列的名称为金额。

我将不胜感激任何意见或帮助

感谢

回答

2

林不知道在您的SQL查询的这最后一部分,但我假设是这样的

SELECT M.Period AS 'Period' , 
C.Code AS 'Group' , 
C.ClientCode AS 'Code' , 
C.ClientName AS 'Name' , 
(SELECT SUM(Amount) AS Expr1 
    FROM  M 
    WHERE  (ClientCode = C.ClientCode) 
    GROUP BY ClientCode 
) AS 'Amount' 
from C inner join M on C.ClientCode = M.ClientCode 

所以你的LINQ会这

var test = from c in db.C 
select new { 
    Period = c.M.Period, 
    Group = c.Code, 
    Code = c.ClientCode, 
    Name = c.ClientName, 
    Amount = (System.Int32) 
    ((from m0 in db.M 
    where 
     m0.ClientCode == c.ClientCode 
    group m0 by new { 
     m0.ClientCode 
    } into g 
    select new { 
     Expr1 = (System.Int32)g.Sum(p => p.Amount) 
    }).First().Expr1) 
} 
+0

哇!谢谢Raymund!是的,只是把它放在..它的工作原理:-)谢谢....你会这么好解释为什么我需要Expr1,然后在第一个()另一个Expr1?当然,如果我删除EXPR1它失败..但我不完全理解为什么它有:-) – Martin 2010-11-17 21:17:42

+0

Expr1是计算总和的变量,第二个Expr1暴露它 – Raymund 2010-11-17 21:43:54