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

如何用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();
}

关键逻辑说明

  1. 参数解析:将前端传入的逗号分隔字符串拆分、转换为int,再验证并转换为Color枚举集合,过滤无效值
  2. 枚举筛选:使用Contains方法实现枚举值的批量匹配,EF Core会自动将此LINQ表达式转换为对应的SQL IN查询
  3. 兼容性处理:如果参数无法解析为有效枚举值,自动回退到原有按Id/Name搜索的逻辑
  4. 返回类型修正:将方法返回类型改为Task<List<Car>>,符合"获取所有车辆"的语义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:05:31