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

EF6中按双列GroupBy并选择Min()及其他新增字段的实现方法

场景1:将TypeOfVehicle加入分组维度

如果业务要求相同RateClass + 相同TypeOfVehicle的数据才归为同一组,直接修改分组键为复合键即可:

// 分组时同时指定两个字段作为分组Key
var data = rates.GroupBy(t => new { t.RateClass, t.TypeOfVehicle })
    .Select(g => new Rates {
        RateClass = g.Key.RateClass,
        TypeOfVehicle = g.Key.TypeOfVehicle, 
        CostDay = g.Min(x => x.CostDay),
        CostWeek = g.Sum(x => x.CostWeek)
    })
    .ToList();

场景2:保持原分组维度(仅按RateClass分组),取分组内指定规则的TypeOfVehicle

如果还是仅按RateClass分组,需要根据业务规则取分组内的TypeOfVehicle值,常见规则写法如下:

取分组内CostDay最小的那条记录对应的TypeOfVehicle

var data = rates.GroupBy(t => t.RateClass)
    .Select(g => new Rates {
        RateClass = g.Key,
        // 先按CostDay升序排序,取第一条的TypeOfVehicle值
        TypeOfVehicle = g.OrderBy(x => x.CostDay).First().TypeOfVehicle,
        CostDay = g.Min(x => x.CostDay),
        CostWeek = g.Sum(x => x.CostWeek)
    })
    .ToList();

如果是EF Core查询(非内存集合查询),该写法在EF Core 6及以上版本可直接翻译为SQL,低版本可改用以下写法避免客户端计算:

var data = rates.GroupBy(t => t.RateClass)
    .Select(g => new {
        g.Key,
        MinCostDay = g.Min(x => x.CostDay),
        SumCostWeek = g.Sum(x => x.CostWeek)
    })
    .Join(rates, 
        g => new { g.Key, g.MinCostDay },
        r => new { r.RateClass, MinCostDay = r.CostDay },
        (g, r) => new Rates {
            RateClass = g.Key,
            TypeOfVehicle = r.TypeOfVehicle,
            CostDay = g.MinCostDay,
            CostWeek = g.SumCostWeek
        })
    .ToList();

拼接分组内所有TypeOfVehicle值

如果需要把同分组下所有车辆类型拼接展示,可使用:

TypeOfVehicle = string.Join(",", g.Select(x => x.TypeOfVehicle).Distinct())

内容的提问来源于stack exchange,提问作者Ben Junior

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:39:03