如何在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
相关产品推荐
相关产品推荐

