在事务对象列表中,我尝试按BatchNo进行分组,然后对Amounts进行求和。
public class Extract
{
// Notable fields in TRANSACTION are: String mBatchNo, String mAmount
private List<Transaction> Transactions;
public void testTransactions()
{
// Sum of amounts grouped by batch number
var sGroup = from t in Transactions
group t by t.mBatchNo into g
select new { batchNo = g.Key,
totalAmount = g.Max(a => (Int32.Parse(a.mAmount)))};
}
}
此时,我通过locals窗口进入代码查看,看看我的结果集是针对我导入到此对象的文件进行检查的。
文件中的最后一批有3条记录,每条100条金额可以看到钻入“交易”列表对象。但是向下钻取到sGroup结果会发现同一批次总数为100(应为300)。我在这个查询中搞砸了什么?
请注意,我已将其存储为字符串,因为我们在8字符字段的左侧填零。出于出口原因,我决定将其存储为字符串。虽然这可以(也可能会)改变,但它没有回答我的问题:如何使这个查询通过BatchNo将总和聚合成集?
答案 0 :(得分:16)
var sGroup = from t in Transactions
group t by t.mBatchNo into g
select new {
batchNo = g.Key,
totalAmount = g.Sum(a => (int.Parse(a.mAmount))) // Sum, not Max
};
我还建议,如果您的mAmount
字段存储为string
,则使用比int.Parse
更强大的方法(因为如果字符串不是,则会抛出异常一个有效的整数,例如,如果它是空白的)。像这样:
int ParseOrZero(string text)
{
int value;
if (int.TryParse(text, out value))
return value;
else
return 0;
}
var sGroup = from t in Transactions
group t by t.mBatchNo into g
select new {
batchNo = g.Key,
totalAmount = g.Sum(ParseOrZero) // blanks will be treated as 0
};
答案 1 :(得分:2)
而不是做max,你应该在你的小组上使用总和。现在,您只将属性设置为对象中的最大值,sum将对属性中的所有值求和。