我有一个linq查询结果,如图所示。在最后一个查询(未显示)中,我按Year按LeaveType分组。但是我想计算多年来每种类型的LeaveCarriedOver的运行总额。也就是说,2010年的病假LeaveCarriedOver变成了2011年病假的“期初”余额加上2011年的病假。
我对显示的结果列表进行了另一个查询,如下所示:
var leaveDetails1 = (from l in leaveDetails
select new
{
l.Year,
l.LeaveType,
l.LeaveTaken,
l.LeaveAllocation,
l.LeaveCarriedOver,
RunningTotal = leaveDetails.Where(x => x.LeaveType == l.LeaveType).Sum(x => x.LeaveCarriedOver)
});
其中,leaveDetails是图像的结果。
生成的RunningTotal并非按预期累积。我如何实现我的最初目标。接受任何想法-我的最后一个选择是在前端的javascript中进行操作。提前致谢
最佳答案
简单的实现方法是先获取可能总数的列表,然后再从每个类别的详细信息中获取总和。
获取Year
和LeaveType
的不同列表是一个分组依据,并从每个分组中选择第一个。我们返回一个List<Tuple<int, string>>
,其中Int
是年份,而string
是LeaveType
var distinctList = leaveDetails1.GroupBy(data => new Tuple<int, string>(data.Year, data.LeaveType)).Select(data => data.FirstOrDefault()).ToList();
那么我们需要这些元素中的每个元素的总数,因此您要对该列表进行选择,以返回id(
Year
和LeaveType
)加上总数,以便给Tuple<int, string, int>
一个额外的值。var totals = distinctList.Select(data => new Tuple<int, string, int>(data.Year, data.LeaveType, leaveDetails1.Where(detail => detail.Year == data.Year && detail.LeaveType == data.LeaveType).Sum(detail => detail.LeaveCarriedOver))).ToList();
阅读上面的行,您会看到它采用了我们想要列出的不同总计,创建了一个新对象,存储了
Year
和LeaveType
供参考,然后使用该Int
和Sum<>
的已过滤详细信息的Year
设置最后一个LeaveType
。关于javascript - 如何使用linq计算运行总额,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29794737/