Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用groupby将SQL转换为lambda_C#_Sql_Lambda_Linq To Entities - Fatal编程技术网

C# 使用groupby将SQL转换为lambda

C# 使用groupby将SQL转换为lambda,c#,sql,lambda,linq-to-entities,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表达式

我正在尝试翻译这个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表达式的ef4查询中,我遗漏了一些东西

我有:

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


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

您没有发布错误消息,但我怀疑它与
包含的内容有关。我发现
任何
都同样有效

这会让你非常接近:

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()
    };
试试这个:

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

行的类型是什么?它是否实现了
IEquatable
?没有得到任何错误,问题是结果集计算不正确。例如,对于row=1的记录,SQL语句给出VarSum=30、VarAve=5、TotalCount=6。此版本和Fabrice的lambda版本的结果集都给出了VarSum=5、VarAve=5.0和TotalCount=1。(我假设select new中的's.Sum'是'g.Sum')。看起来并不是所有记录的总和。表中有多条记录在“row”字段中具有相同的值,我正试图根据所有相关的行值提取统计信息。row=1的表中的数据包括这些记录:/row Total Average Count/1 5 5 5 5/1 5 5 5 5/1 5 5 5 5/1 5 5 5/@DeeDub84,您处理的每个项目都有唯一的id吗?否则,您可能会发现,在使用实体框架时,select语句中会排除行,这取决于您使用它的方式。无论如何,我认为你的问题中没有足够的信息来帮助你。我认为问题出在.Contains或.any中。它仅选择与列表中第一项匹配的表行,而不是与任何项匹配的表行。目前,sumvars是一个字符串[],由sumvars=sv.staticvararraylist填充,它是一个带有逗号分隔列表的字段。我想选择变量名在sumvars列表中的行。不过一定是出了什么问题。我建议你试试LINQpad。它了解EF,并将向您显示它为给定LINQ to Entities表达式生成的SQL。Fabrice,请参阅我对Drew的评论。结果集不是所有记录的总和/平均值/计数。