使用groupby将SQL转换为lambda

时间:2013-04-12 20:05:02

标签: c# sql lambda linq-to-entities

我正在尝试翻译这个sql语句

SELECT row, SUM(value) as VarSum, AVG(value) as VarAve, COUNT(value) as TotalCount 
FROM MDNumeric
WHERE collectionid = 6 and varname in ('C3INEV1', 'C3INEVA2', 'C3INEVA3', 'C3INVA11', 'C3INVA17', 'C3INVA19')
GROUP BY row

使用lambda表达式进入EF 4查询并丢失了一些内容。

我有:

sumvars = sv.staticvararraylist.Split(',');

var aavresult = _myIFR.MDNumerics
    .Where(r => r.collectionid == _collid)
    .Where(r => sumvars.Contains(r.varname))
    .GroupBy(r1 =>r1.row)
    .Select(rg =>
          new
          {
              Row = rg.Key,
              VarSum = rg.Sum(p => p.value),
              VarAve = rg.Average(p => p.value),
              TotalCount = rg.Count()
          });

其中staticvararraylist的字符串为'C3INEV1','C3INEVA2','C3INEVA3','C3INVA11','C3INVA17','C3INVA19'(不带单引号),_collid变量= 6。

当我得到正确的分组时,我的总和,平均值和&计数值不正确。

2 个答案:

答案 0 :(得分:0)

您没有发布错误消息,但我怀疑它与Contains有关。我发现Any的效果也一样。

这应该让你非常接近:

var result =
    from  i in _myIFR.MDNumerics
    where i.collectionid == _collid && sumvars.Any(v => i.varname == v)
    group i by i.row into g
    select new {
        row = g.Key,
        VarSum = g.Sum(p => p.value),
        VarAve = g.Average(p => p.value),
        TotalCount = g.Count()
    };

答案 1 :(得分:0)

试试这个:

var aavresult = _myIFR.MDNumerics
.Where(r => r.collectionid == _collid && sumvars.Contains(r.varname))
.GroupBy(r1 =>r1.row,
  (key,res) =>    new
      {
          Row = key,
          VarSum = res.Sum(r1 => r1.value),
          VarAve = res.Average(r1 => r1.value),
          TotalCount = res.Count()
      });