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

C# LINQ实现SQL LIKE多值匹配报错问题求助

问题解决:LINQ多模糊匹配报错的修复方案

你的代码报错核心原因是:EF(Entity Framework)无法将内存数组的Any方法转换为对应的SQL语句。EF只能解析能直接映射到SQL的表达式,而内存集合的Any操作不在可翻译范围内;单独用u.ON_DATE.Contains("2020")能正常工作,是因为这个方法可以被EF直接翻译成LIKE '%2020%'的SQL语句。

下面提供三种可行的修复方案,根据你的场景选择:

方案一:手动拼接OR条件(适合数组元素固定且数量少的情况)

直接把数组中的每个元素对应的Contains用||连接,EF能正常翻译为多个LIKE的OR查询:

string[] DATE_Group = { "2020", "2021" };
var query = _context.c10
    .Where(u => u.ON_DATE.Contains(DATE_Group[0]) || u.ON_DATE.Contains(DATE_Group[1]))
    .Select(u => new
    {
        User_NumberID = u.User_NumberID.ToString(),
    })
    .ToList();

方案二:用PredicateBuilder动态构建条件(适合数组元素不固定的情况)

借助LinqKit的PredicateBuilder可以动态生成OR组合的查询条件,避免手动拼接的繁琐:

  1. 先安装LinqKit包:
Install-Package LinqKit
  1. 编写代码:
string[] DATE_Group = { "2020", "2021" };
var predicate = PredicateBuilder.New<C10>();
foreach (var date in DATE_Group)
{
    var tempDate = date; // 避免闭包陷阱,确保循环中变量正确捕获
    predicate = predicate.Or(u => u.ON_DATE.Contains(tempDate));
}

var query = _context.c10
    .AsExpandable() // 启用LinqKit的表达式扩展,让EF能解析动态生成的条件
    .Where(predicate)
    .Select(u => new
    {
        User_NumberID = u.User_NumberID.ToString(),
    })
    .ToList();

方案三:EF Core 3.0+专属:用可查询集合配合EF.Functions.Like

如果使用的是EF Core 3.0及以上版本,可以把内存数组转为可查询集合,配合EF.Functions.Like实现翻译:

string[] DATE_Group = { "2020", "2021" };
var dateQuery = DATE_Group.AsQueryable();

var query = _context.c10
    .Where(u => dateQuery.Any(s => EF.Functions.Like(u.ON_DATE, $"%{s}%")))
    .Select(u => new
    {
        User_NumberID = u.User_NumberID.ToString(),
    })
    .ToList();

额外优化建议

你原来的代码中先调用ToList()再执行Select,会把整个c10表的数据加载到内存后再过滤和投影,效率极低。建议把ToList()放在最后,让EF先在数据库端完成过滤和投影操作,再把结果加载到内存。

内容的提问来源于stack exchange,提问作者sp 4_4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 08:27:36