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

如何将含多组LIKE模糊匹配的SQL存储过程迁移为LINQ语句

核心问题说明

你原有写法存在两处问题:一是LINQ内置join子句仅支持等值匹配,无法直接实现LIKE这类非等值关联逻辑;二是C#本身没有原生支持翻译为SQL LIKE的语法,需要借助EF提供的工具方法实现。


场景1:仅需返回去重的符合任意筛选条件的客户(常用场景,无重复数据)

直接用Any配合EF.Functions.Like实现即可:

// 直接使用SQL标准%作为通配符,无需使用*
var filters = new string[] { "Den%", "%zil", "%la%" };

var results = ctx.Customers
    .Where(c => filters.Any(filter => EF.Functions.Like(c.Country, filter)))
    .OrderBy(c => c.Country)
    .Select(c => new 
    {
        c.CustomerId,
        c.Country
    })
    .ToList();

场景2:完全对齐原SQL逻辑,匹配多个筛选规则时返回多条重复记录

原SQL用内连接实现,客户每匹配一个筛选规则就生成一条记录,对应LINQ用SelectMany实现:

var filters = new string[] { "Den%", "%zil", "%la%" };

var results = ctx.Customers
    .SelectMany(
        // 关联所有匹配的筛选规则
        c => filters.Where(filter => EF.Functions.Like(c.Country, filter)),
        // 拼接返回结果
        (customer, filter) => new { customer.CustomerId, customer.Country }
    )
    .OrderBy(res => res.Country)
    .ToList();

注意事项

如果你使用的是Entity Framework 6版本,将EF.Functions.Like替换为SqlFunctions.Like即可,用法完全一致。不建议手动用StartsWith/Contains/EndsWith拼接规则,动态筛选场景下直接用Like方法可以完美适配所有通配符匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:18:00