如何将含多组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
相关产品推荐
相关产品推荐

