我有一个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中进行操作。提前致谢

最佳答案

简单的实现方法是先获取可能总数的列表,然后再从每个类别的详细信息中获取总和。

获取YearLeaveType的不同列表是一个分组依据,并从每个分组中选择第一个。我们返回一个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(YearLeaveType)加上总数,以便给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();

阅读上面的行,您会看到它采用了我们想要列出的不同总计,创建了一个新对象,存储了YearLeaveType供参考,然后使用该IntSum<>的已过滤详细信息的Year设置最后一个LeaveType

关于javascript - 如何使用linq计算运行总额,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29794737/

10-10 22:14