创建新动态对象时的内联操作

时间:2010-11-23 12:30:28

标签: c# linq c#-3.0

我正在尝试在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
            };

但是我面临两个问题,这些问题可以很容易地解决,但我正在寻找一些干净而有效的东西。

  1. 如何防止调用Sum方法这么多次?是否需要重新分解并减少通话量?

  2. 我想添加一个名为Balance的新成员,它基本上将之前的余额总和(在上一次迭代中)与当前余额相加。是否可以(并且干净)直接在新陈述中进行?使用代表?

  3. 问候

1 个答案:

答案 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()
                    }; 

但我不会称之为“干净”。 =)