如何在.NET 8控制台应用中实现带权重的工单条件计数
解决方案
核心思路
针对不同MediumID设置对应权重,统计时不再直接计数,而是对每个工单的权重值求和,实现加权统计。
步骤1:加载并筛选工单数据
先通过CSOM加载符合类型要求的工单数据到本地,转换为便于处理的匿名对象:
// 初始化SharePoint上下文(此处省略上下文初始化代码) var workList = context.Web.Lists.GetByTitle("Work Orders"); var camlQuery = CamlQuery.CreateAllItemsQuery(); var listItems = workList.GetItems(camlQuery); context.Load(listItems, items => items.Include( item => item["WorkOrderType"], item => item["TechnicianName"], item => item["Year"], item => item["Month"], item => item["MediumID"], item => item["IsDone"] // 假设用该字段标识工单是否完成 )); context.ExecuteQuery(); // 筛选Cleaning、Maintenance类型的工单并转换格式 var workOrders = listItems.Cast<ListItem>() .Where(item => item["WorkOrderType"].ToString() is "Cleaning" or "Maintenance") .Select(item => new { TechnicianName = item["TechnicianName"].ToString(), Year = int.Parse(item["Year"].ToString()), Month = int.Parse(item["Month"].ToString()), MediumID = int.Parse(item["MediumID"].ToString()), IsDone = bool.Parse(item["IsDone"].ToString()) }) .ToList();
步骤2:修改分组统计逻辑
将原有的Count()替换为Sum(),根据MediumID动态累加权重值:
var weightedStats = workOrders .GroupBy(w => new { w.TechnicianName, w.Year, w.Month, w.MediumID }) .Select(g => new { g.Key.TechnicianName, g.Key.Year, g.Key.Month, g.Key.MediumID, // 加权总工单量:MediumID=10/20时每个算0.5,其余算1 TotalWeightedCount = g.Sum(w => w.MediumID is 10 or 20 ? 0.5 : 1.0), // 加权已完成工单量:仅统计已完成工单的权重和 DoneWeightedCount = g.Where(w => w.IsDone).Sum(w => w.MediumID is 10 or 20 ? 0.5 : 1.0) }) .ToList();
可选优化
- 如果业务需要将加权结果转为整数(如四舍五入),可使用
Math.Round():TotalWeightedCount = Math.Round(g.Sum(w => w.MediumID is 10 or 20 ? 0.5 : 1.0), 0) - 若权重规则可能变化,可单独提取为方法提升可维护性:
调用时替换为private static double GetMediumWeight(int mediumId) { return mediumId is 10 or 20 ? 0.5 : 1.0; }Sum(w => GetMediumWeight(w.MediumID))即可。
注意事项
- 确保SharePoint列表中
MediumID、Year、Month等字段为数值类型,避免转换异常; - 若已完成工单的判断逻辑不是基于
IsDone字段,需调整Where(w => w.IsDone)中的条件,匹配实际业务字段(如Status.ToString() == "Completed"); - 若工单数据量极大,可在CAML查询中先做初步筛选减少本地数据量,但复杂加权统计仍需在本地完成(SharePoint CSOM的CAML聚合不支持条件权重计算)。
内容的提问来源于stack exchange,提问作者microsoftdeveloperdesigner
相关产品推荐
相关产品推荐

