我正在尝试在LINQ中向DataGridview(winform)提供一个语句查询。 以下行将记录值的总和分配给债务或贷方成员,具体取决于总和。
交易1 --- *记录
var transactions = from t in this.account.transactions select new {
Debt = t.records.Sum(x=>x.value) < 0 ? t.records.Sum(x=>x.value).ToString() : String.Empty,
Credit = t.records.Sum(x => x.value) > 0 ? t.records.Sum(x => x.value).ToString() : String.Empty
};
但是我面临两个问题,这些问题可以很容易地解决,但我正在寻找一些干净而有效的东西。
如何防止调用Sum方法这么多次?是否需要重新分解并减少通话量?
我想添加一个名为Balance的新成员,它基本上将之前的余额总和(在上一次迭代中)与当前余额相加。是否可以(并且干净)直接在新陈述中进行?使用代表?
问候
答案 0 :(得分:2)
关于你的第一个问题,这是你如何做到的:
var transactions = from t in this.account.transactions
let sum = t.records.Sum(x => x.value)
select new
{
Debt = sum < 0 ? sum.ToString() : String.Empty,
Credit = sum > 0 ? sum.ToString() : String.Empty
};
至于你的第二个问题,我真的对一个干净的解决方案感兴趣。 LINQ似乎不是设计用于除单个记录之外的任何其他内容。你可以做到
double balance = 0;
var transactions = from t in this.account.transactions
let sum = t.records.Sum(x => x.value)
let newBalance = balance += sum
select new
{
Debt = sum < 0 ? sum.ToString() : String.Empty,
Credit = sum > 0 ? sum.ToString() : String.Empty,
Balance = newBalance.ToString()
};
但我不会称之为“干净”。 =)