代码之家  ›  专栏  ›  技术社区  ›  Martin

使用SUM和GROUP BY的带子选择查询的LINQ?

  •  0
  • Martin  · 技术社区  · 15 年前

    有人能帮我查询一下LINQ吗?我已经转换了其中的大部分,但在存储过程中有一个子查询,我无法确定如何进行转换。

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

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

    但是我对如何进行子查询感到茫然。列的名称将是您在旧存储过程中能够看到的金额。

    如果有任何反馈或帮助,我将不胜感激

    谢谢

    1 回复  |  直到 15 年前
        1
  •  2
  •   Raymund    15 年前

    我不确定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)
    }