You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:27:38