我想在DataGridView
显示客户的会计历史,我想有显示其资产负债运行总计列运行总计。我这样做的旧方法是获取数据,循环访问数据,并逐行添加行并计算当时的运行总数。瘸。我更愿意使用LINQ to SQL,或LINQ(如果LINQ to SQL不可能的话)来计算总运行总数,所以我可以将DataGridView.DataSource
设置为我的数据。LINQ to SQL和订购的结果
这是我拍摄的一个超简单的例子。假设我有以下课程。
class Item
{
public DateTime Date { get; set; }
public decimal Amount { get; set; }
public decimal RunningTotal { get; set; }
}
我想一个L2S,或LINQ,可能产生的结果是这样的语句:
Date Amount RunningTotal
12-01-2009 5 5
12-02-2009 -5 0
12-02-2009 10 10
12-03-2009 5 15
12-04-2009 -15 0
注意,可以有多个项目具有相同的日期(12-02-2009 )。在计算运行总数之前,结果应按日期排序。我猜这意味着我需要两条语句,一条是获取数据并对其进行排序,另一条是执行运行总计算。
我希望Aggregate
会做的伎俩,但它不工作就像我希望。或者,我可能无法弄清楚。
这question似乎我想同样的事情后进行下去,但我没有看到接受/只回答如何解决我的问题。
关于如何解决这个问题的任何想法?
编辑 梳理从亚历克斯和DOK的答案,这是我结束了:
decimal runningTotal = 0;
var results = FetchDataFromDatabase()
.OrderBy(item => item.Date)
.Select(item => new Item
{
Amount = item.Amount,
Date = item.Date,
RunningTotal = runningTotal += item.Amount
});
感谢您的新工具! :RunningTotal = runningTotal + = item.Amount – 2015-03-17 19:39:40
此解决方案是否强制执行在客户端上? (即它必须拉下整个结果集才能得到正确的答案?) - 如果在SQL服务器上完成这样的操作,看起来像这样会更加高效... – BrainSlugs83 2015-06-25 21:14:18
在查询中使用外部变量是非常危险的!因为'result'变量是'IEnumerable'类型的,所以它的**执行将被推迟**直到后面。如果您在此之前更改'runningTotal'的值,您的结果查询将不再正确。为了安全起见,你需要立即枚举它(列表或数组)。使用简单的'foreach'循环我没有看到任何错误。 – Alexey 2015-06-30 05:13:20