如何用C# LINQ筛选匹配指定枚举值的Car数据?
修正包含枚举筛选的LINQ查询逻辑
需求说明
前端传入逗号分隔的数字字符串(对应Color枚举的数值),需要实现LINQ查询筛选出Color属性匹配指定枚举值的所有Car数据,同时保留原有按Id/Name搜索的逻辑。
问题分析
原代码存在以下问题:
- 方法返回类型错误:
GetAllCars应返回多个Car实例,应为Task<List<Car>>而非Task<Car> - Switch分支的case值无实际意义,无法处理前端传入的枚举筛选参数
- LINQ查询语法错误,变量引用混乱,未正确实现枚举匹配逻辑
修正后的完整代码
class Car { public int Id { get; set; } public string Name { get; set; } public Color Color { get; set; } } public enum Color { Red = 1, Blue = 2, Pink = 3, Orange = 4, } // 修正返回类型为Task<List<Car>>,表示返回多个Car实例 public async Task<List<Car>> GetAllCars(string searchString) { // 假设query是预先定义的IQueryable<Car>数据源,比如从EF Core上下文获取 IQueryable<Car> query = _dbContext.Cars; // 先尝试解析逗号分隔的数字为Color枚举集合 if (!string.IsNullOrEmpty(searchString)) { var colorValues = searchString.Split(',') .Select(s => int.TryParse(s.Trim(), out int val) ? val : -1) .Where(val => val != -1 && Enum.IsDefined(typeof(Color), val)) .Select(val => (Color)val) .ToList(); if (colorValues.Any()) { // 筛选Color属性在目标枚举集合中的数据 query = query.Where(car => colorValues.Contains(car.Color)); return await query.ToListAsync(); } else { // 解析失败,执行原有Id/Name搜索逻辑 query = query.Where(car => car.Id.ToString().Contains(searchString) || car.Name.Contains(searchString)); } } return await query.ToListAsync(); }
关键逻辑说明
- 参数解析:将前端传入的逗号分隔字符串拆分、转换为
int,再验证并转换为Color枚举集合,过滤无效值 - 枚举筛选:使用
Contains方法实现枚举值的批量匹配,EF Core会自动将此LINQ表达式转换为对应的SQL IN查询 - 兼容性处理:如果参数无法解析为有效枚举值,自动回退到原有按
Id/Name搜索的逻辑 - 返回类型修正:将方法返回类型改为
Task<List<Car>>,符合"获取所有车辆"的语义
内容的提问来源于stack exchange,提问作者KrzysztofBojarczuk
相关产品推荐
相关产品推荐

