2010-11-17 103 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