【问题标题】:LINQ DataTable Sum In Where ClauseLINQ DataTable Sum In Where 子句
【发布时间】:2010-08-19 14:36:02
【问题描述】:

我很难弄清楚如何对 DataTable 执行 LINQ 查询并返回一整行,同时对总和进行 WHERE 子句测试。

我的代码:

transactionsToRemove.AddRange(paymentTransactionResults
     .AsEnumerable()
     .Where(...)
     .GroupBy(r => (decimal)r["AccountNumber"]));

每个 AccountNumber 有多个交易,我需要将它们相加并确定它们是否小于用户输入的金额(出于我的目的,它称为 balanceGreaterThan)。我找不到任何人做过这种事情的例子。

提前致谢,所以。

编辑:抱歉——我需要求和的那一列叫做“余额”

编辑 2:最终代码

transactionsToRemove.AddRange(paymentTransactionResults
     .AsEnumerable()
     .GroupBy(r => r.Field<string>("AccountNumber"))
     .Where(g => g.Sum(r => r.Field<decimal>("Balance")) < balanceGreaterThan)
     .SelectMany(g => g));

我不得不更改 GroupBy 以使用 r.Field 而不是 r["AccountNumber"]

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    您正在尝试过滤组本身(以查找哪些组的总和较大),而不是进入组的行。
    因此,您需要将Where() 调用放在GroupBy 之后:

    transactionsToRemove.AddRange(paymentTransactionResults
         .AsEnumerable()
         .GroupBy(r => (decimal)r["AccountNumber"])
         .Where(g => g.Sum(r => r.Field<decimal>("Balance") < balanceGreaterThan));
    

    编辑:如果您想返回IEnumerable&lt;DataRow&gt;(而不是IEnumerable&lt;IGrouping&lt;DataRow&gt;&gt;),您需要添加.SelectMany(g =&gt; g)

    【讨论】:

    • 哇,SLaks 正试图对所有其他答案都非常挑剔,以获得他自己的支持。狡猾!
    • @Timwi:我对大多数答案都这样做,即使我不与他们竞争。这是一个相当初级的问题,因此正确了解细节很重要。另外,我没有投反对票。
    • 是的,我需要 IEnumerable 回来。你帮了很多忙。上面发布的完整代码。
    • AFAIK,如果没有 AsEnumerable(),您将无法对非类型化数据表执行 LINQ 查询。
    • @Timwi:这是在 System.Data.DataSetExtensions.dll 中 System.Data.DataTableExtensions 中定义的 DataTable 的扩展方法。
    【解决方案2】:
    transactionsToRemove.AddRange(paymentTransactionResults
         .AsEnumerable()
         .GroupBy(r => (decimal)r["AccountNumber"])
         .Where(g => g.Sum(r => (decimal)r["Balance"]) <= someInput)
         .SelectMany(g => g));
    

    【讨论】:

    • 不会编译。 g 不是 IEnumerable&lt;decimal&gt;
    • 现在试试 - 我已经加入了SelectMany :)
    • 是的,我在一些错误的输入数据上尝试过(不是在 DataTable 上)。我认为它现在可以工作了。
    【解决方案3】:

    我想你想要这样的东西:

    transactionsToRemove.AddRange(paymentTransactionResults 
         .AsEnumerable() 
         .GroupBy(r => (decimal)r["AccountNumber"])); 
         .Where(grp => grp.Sum(r => r["amount"]) < balanceGreaterThan);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多