我很难确切地知道如何在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”]
答案 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);