【问题标题】:Linq Objects Group By & SumLinq 对象分组方式和总和
【发布时间】:2013-01-06 02:20:56
【问题描述】:

我有一个包含“否”和“总计”列的数据表。我想带回每个“否”的“总计”列的总和。我已经尝试了以下方法,但由于语法问题,我遇到了几个错误。

var Values =
        (from data in DtSet.Tables["tblDetails"].AsEnumerable()
         group data by data.Field<"No">
         select new
         {
             name_1 = data.Field<double>("No"),
             name_2 = data.Field<double>("Total"),
         }
         );   

【问题讨论】:

标签: c# linq dataset sum


【解决方案1】:

你开始使用 linq,但好老的 DataTableown way

var total = DtSet.Tables["tblDetails"].Compute("sum(Total)", "No = x");

我必须在其中保留x,因为我不知道“否”列的值。 "No = x" 部分是一个过滤器。如果为 null 或空字符串,所有行都将用于计算。

【讨论】:

  • 所以你必须为每个No做这个?在那种情况下,我认为这在各方面都比 LINQ 差。
  • @svick 不,它会立即计算整个表。
  • 但是第二部分是过滤器,不是吗?因此,如果我想计算每个No(问题要求)的总和,我必须为每个No 执行此操作。例如,如果 No 的值是 1,2,…1000,那么我将不得不使用 No=1,No=2,…,No=1000 执行它。还是我错过了什么?
  • @svick 啊,对不起,我现在明白你的意思了。过滤器可以为 null 或空字符串以使用所有行。很好,你让我添加了这个。
【解决方案2】:

这将为您提供name_2 属性中Total 字段的总和,并在name_1 属性中对No 进行分组(我认为您需要在这里更好地命名)

var Values = from row in DtSet.Tables["tblDetails"].AsEnumerable()
             group row by row.Field<double>("No") into g
             select new
             {
                 name_1 = g.Key,
                 name_2 = g.Sum(r => r.Field<double>("Total"))
             };

请考虑名称 NoTotalSum

【讨论】:

  • 感谢有关命名约定的提示。您的代码有效 - 谢谢。我将如何通过另一个不需要求和的列,例如,name_3 将是字段“AccountNo”...?
  • @user1936588 是否所有具有相同No 值的行都具有相同的AccountNo?如果是,那么您可以将AccountNo 包含在分组键中。否则,您将拥有这样的帐号列表Accounts = g.Select(r =&gt; r.Field&lt;string&gt;("AccountNo").ToList()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
相关资源
最近更新 更多