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

如何在LINQ中根据条件分组以消除重复代码?

优化LINQ条件分组,消除重复代码

你可以通过两种简洁方式实现条件分组,避免重复编写Select转换逻辑:

方法一:提前定义分组键选择器

先根据isRecipe的值确定分组键的选择逻辑,再复用后续统一的转换代码:

var allergensList = _context.RecipeAllergens
    .Where(x => x.ParentId == Id && x.AllergenId != null)
    .ToList();

// 根据isRecipe选择对应的分组键
Func<RecipeAllergen, object> groupKeySelector = isRecipe 
    ? (Func<RecipeAllergen, object>)(x => new { x.AllergenName, x.AllergenIcon, x.AllergenMaycontains })
    : x => new { x.AllergenName, x.AllergenIcon };

// 统一执行分组和转换逻辑
var allergens = allergensList
    .GroupBy(groupKeySelector)
    .Select(a =>
    {
        var v = a.OrderBy(x => x.AllergenMaycontains).First();
        return new AllergenInfo
        {
            AllergenName = v.AllergenName,
            AllergenIcon = v.AllergenIcon,
            AllergenMayContain = v.AllergenMaycontains ?? false
        };
    })
    .ToList();

方法二:在分组键中嵌入条件判断

直接在匿名类型的分组键里,根据isRecipe动态决定AllergenMaycontains字段是否参与分组(通过设为null消除其分组影响):

var allergensList = _context.RecipeAllergens
    .Where(x => x.ParentId == Id && x.AllergenId != null)
    .ToList();

var allergens = allergensList
    .GroupBy(x => new { 
        x.AllergenName, 
        x.AllergenIcon, 
        // isRecipe为false时统一设为null,消除该字段对分组的影响
        AllergenMaycontains = isRecipe ? x.AllergenMaycontains : (bool?)null 
    })
    .Select(a =>
    {
        var v = a.OrderBy(x => x.AllergenMaycontains).First();
        return new AllergenInfo
        {
            AllergenName = v.AllergenName,
            AllergenIcon = v.AllergenIcon,
            AllergenMayContain = v.AllergenMaycontains ?? false
        };
    })
    .ToList();

两种方法都将重复的Select逻辑完全复用,仅在分组键部分做条件区分,大幅减少代码冗余。

内容的提问来源于stack exchange,提问作者Karim Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:05:12