LINQ DataTable Sum在Where子句中

时间:2010-08-19 14:36:02

标签: c# .net linq

我很难确切地知道如何在DataTable上执行LINQ查询,并在对总和进行WHERE子句测试时返回完整行。

我的代码:

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

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

提前致谢,SO。

编辑:道歉 - 我需要汇总的列名为“余额”

编辑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”]

3 个答案:

答案 0 :(得分:4)

您尝试过滤组本身(以查找哪些组有大笔金额),而不是进入组的行。
因此,您需要在Where()

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

编辑:如果您希望获得IEnumerable<DataRow>(而不是IEnumerable<IGrouping<DataRow>>),则需要添加.SelectMany(g => g)

答案 1 :(得分:3)

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

答案 2 :(得分:1)

我想你想要这样的东西:

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