使用Lambda表达式的LINQ——Join,Group By,Sum和Count

6
我该如何将这个SQL查询转换为Linq Lambda表达式呢?
    SELECT  BN.DEUF, 
            BN.DESUPERINTENDENCIAREGIONAL,
            CR.SITUACAODIVIDA, 
            COUNT(CR.VLEFETIVAMENTELIBERADO), 
            SUM(CR.VLEFETIVAMENTELIBERADO)
   FROM BENEFICIARIO BN
   JOIN CREDITO CR ON BN.CDBENEFICIARIO = CR.CDBENEFICIARIO
   GROUP BY BN.DEUF,BN.DESUPERINTENDENCIAREGIONAL, CR.SITUACAODIVIDA
   ORDER BY BN.DEUF

到目前为止,我已经:

var itens = db.CREDITO
            .Join(db.BENEFICIARIO, cr => cr.CDBENEFICIARIO, bn => bn.CDBENEFICIARIO,
                                (cr, bn) => new { cr, bn })
            .GroupBy(cr => cr.VLEFETIVAMENTELIBERADO)
            .Select(g => new { VLTOTAL = g.Sum(x => x.VLEFETIVAMENTELIBERADO) })
            .ToList();
2个回答

14

你的 SQL 和 LINQ 中不能使用相同的 Group By。

所以... 让我们开始吧!

var itens = db.CREDITO
            .Join(db.BENEFICIARIO, cr => cr.CDBENEFICIARIO, bn => bn.CDBENEFICIARIO,(cr, bn) => new { cr, bn })
            .GroupBy(x=> new{x.bn.DEUF,x.bn.DESUPERINTENDENCIAREGIONAL, x.cr.SITUACAODIVIDA})
            .Select(g => new { 
                       g.Key.DEUF,
                       g.Key.DESUPERINTENDENCIAREGIONAL,
                       g.Key.SITUACAODIVIDA,
                       VLTOTAL = g.Sum(x => x.cr.VLEFETIVAMENTELIBERADO),
                       Count = g.Count() 
                       })
            .ToList();

运行得非常好!只需要调整VLTOTAL = g.Sum(x => x.cr.VLEFETIVAMENTELIBERADO)... - Ian Campelo
如果我需要选择其他未用于分组的列怎么办? - Wedad Shurrab
@WedadShurrab 列必须要么在聚合函数(sum、max、avg...)中,要么在group by子句中。 - Raphaël Althaus

3

您需要在Group By子句中创建一个匿名类型来按多个列进行分组。 下面是一种可行的方法:

var itens = db.CREDITO
            .Join(db.BENEFICIARIO, cr => cr.CDBENEFICIARIO, bn => bn.CDBENEFICIARIO,
                                (cr, bn) => new { cr, bn })
            .GroupBy(x => new { 
                                  x.cr.SITUACAODIVIDA, 
                                  x.bn.DEUF, 
                                  x.bn.DESUPERINTENDENCIAREGIONAL 
                              }
             )
            .Select(g => new { 
                                 DEUF = g.Key.DEUF,
                                 SITUACAODIVIDA = g.Key.SITUACAODIVIDA,
                                 VLTOTAL = g.Sum(z => z.cr.VLEFETIVAMENTELIBERADO),
                                 Count = g.Count()
                             }
                   ).ToList();

1
非常好,太棒了!非常感谢!;) - Ian Campelo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接