我正在用一些linq查询逻辑敲打我的脑袋。
我有一些工作单清单,我会计算每周总计的项目。
下面是我的代码。
var workorder = (
from item in result1
where
GetShortDate(item.Date)>=iStartDay
&&
GetShortDate(item.Date) < isunday
&& item.WorkOrderId !=null
group item by new { item.WorkOrderId, item.Count,item.Date } into resGroup
select new {
OrderId = resGroup.Key.WorkOrderId,
Count = resGroup.Key.Count,
Date = resGroup.Key.Date
})
.Distinct()
.ToList();
var weeklycount = workorder.Sum(obj => obj.Count);
听到我的result1输入:
workorderId =1 , count = 8,date = 12/12/12
workorderId =1 , count = 8,date = 13/12/12
workorderId =2 , count = 1,date = 14/12/12
根据上述逻辑,我每周都会将其作为 17 ,但我只需要 9 ,因为我的workorderId在两天内是相同的。无需关心约会。
我怎样才能实现这一点。有人指导我。
答案 0 :(得分:2)
Distinct
在这里不起作用,你的对象并不明显!
你需要按workorderId进行分组,并且(可能)只包括总和中的第一项
var workordersForWeek = (from item in allresult
where
GetShortDate(item.Date)>=iStartDay
&&
GetShortDate(item.Date) < isunday
&& item.WorkOrderId !=null //to eleminate weekly total, which will not have workorderid
group item by new { item.WorkOrderId, item.Count,item.Date } into resGroup
select new {
workOrderId=resGroup.Key.WorkOrderId,
Count=resGroup.Key.Count,
Date=resGroup.Key.Date
}).GroupBy(x => x.WorkOrderId).Sum(obj => obj.First().Count)
但正如你所看到的,现在这个组的结果是两次。这个答案可能会做你想要的,但是如果你不关心日期,可能有一种更简单的方法,包括不按日期分组。
您可能想尝试以下方面的内容:
var workordersForWeek = allresult.Where(item => GetShortDate(item.Date) >= iStartDay
&& GetShortDate(item.Date) < isunday
&& item.WorkOrderId != null)
.GroupBy(item => item.WorkOrderId, x => x.Count);
var weeklycount = workordersForWeek.Sum(x => x.First());
未经测试,所以不是100%肯定。
答案 1 :(得分:0)
通过查看您的查询的这一部分 新项目{item.WorkOrderId,item.Count,item.Date} 的组项目WorkOrderId 1有两个不同的日期,因此它出现两次,然后您计算两次。从分组中删除item.Date。