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

如何在C#中正确转换枚举为字符串?ASP.NET MVC查询遇故障

解决EF Core中枚举转字符串搜索的问题

你遇到的问题根源是:EF Core无法将.NET客户端方法Enum.ToString()转换为对应的SQL语句,所以在LINQ查询里直接使用会导致查询执行失败。

下面给你几个可行的解决方案:

方案1:先筛选匹配的枚举值,再查询数据库

先在内存中找出所有名称包含搜索关键词的枚举值,再用这些值去数据库查询匹配的记录,这个方法兼容性最好,不需要修改数据库或EF配置:

public async Task<List<ContactDTO>> LiveSearchForContacts(string search)
{
    // 提取所有名称包含搜索词的City枚举值
    var targetCities = Enum.GetValues<City>()
                           .Where(city => city.ToString().Contains(search))
                           .ToList();

    var contacts = await _context.Contacts
                                 .Where(c => c.Name.Contains(search) 
                                          || c.PhoneNumber.Contains(search)
                                          || targetCities.Contains(c.CityType))
                                 .ToListAsync();

    // 直接用AutoMapper批量映射,简化代码
    return _mapper.Map<List<ContactDTO>>(contacts);
}

方案2:将枚举以字符串形式存储到数据库(EF Core 5+)

如果你的项目使用EF Core 5及以上版本,可以配置模型将枚举字段以字符串形式存储到数据库,这样就能直接在查询中用字符串匹配:

第一步:配置模型转换

在DbContext的OnModelCreating方法中添加枚举转换配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Contact>()
                .Property(c => c.CityType)
                .HasConversion<string>(); // 告诉EF将枚举存为字符串
}

第二步:执行数据库迁移

配置完成后,需要生成并运行数据库迁移,将原有的枚举数值字段改为字符串类型。

第三步:修改查询

之后就可以直接使用你原来的查询逻辑,EF Core会自动将枚举的字符串比较转换为SQL:

public async Task<List<ContactDTO>> LiveSearchForContacts(string search)
{
    var contacts = await _context.Contacts
                                 .Where(c => c.Name.Contains(search) 
                                          || c.PhoneNumber.Contains(search)
                                          || c.CityType.ToString().Contains(search))
                                 .ToListAsync();

    return _mapper.Map<List<ContactDTO>>(contacts);
}

方案3:使用EF.Functions.Like结合字段转换(不推荐,兼容性差)

如果不想修改数据库结构,可以尝试用EF Core的EF.Functions.Like结合字段转换,但这个方法依赖数据库的类型转换支持,不同数据库可能有差异:

public async Task<List<ContactDTO>> LiveSearchForContacts(string search)
{
    var contacts = await _context.Contacts
                                 .Where(c => c.Name.Contains(search) 
                                          || c.PhoneNumber.Contains(search)
                                          || EF.Functions.Like(EF.Property<string>(c, "CityType"), $"%{search}%"))
                                 .ToListAsync();

    return _mapper.Map<List<ContactDTO>>(contacts);
}

总结:优先选择方案1(无需修改数据库)或方案2(长期更灵活),方案3仅作为临时替代方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:25:03