Dynamic LINQ中使用LIKE运算符出现解析异常的问题排查
问题原因及解决方案
问题本质
官方文档的示例存在版本适配问题,DynamicFunctions.Like的用法在新版本的Dynamic LINQ(尤其是EF Core适配版本)中已不再兼容,解析器会错误地将DynamicFunctions识别为枚举类型而非静态类。
可行解决方案
方案1:使用原生字符串匹配方法替代(推荐)
Dynamic LINQ支持直接映射SQL LIKE的原生方法,无需依赖DynamicFunctions:
Contains("xxx")对应LIKE '%xxx%'StartsWith("xxx")对应LIKE 'xxx%'EndsWith("xxx")对应LIKE '%xxx'
修改后的查询代码:
// 单条件示例 var result = queryable.Where(config, "MyColumn.Contains(@0)", "%a%").ToList(); // 复杂多条件拼接示例 var query = string.Join($" {myOperator} ", values.Select((value, index) => $"MyColumn.Contains(@{index})")); if (isNot) query = $"not ({query})"; return queryable.Where(config, query, values);
方案2:手动注册DynamicFunctions类型
如果必须使用Like语法,需将DynamicFunctions静态类添加到解析器的已知类型集合中,确保解析器能正确识别:
var config = new ParsingConfig { ResolveTypesBySimpleName = true, // 添加DynamicFunctions类型到已知类型 KnownTypes = { typeof(Microsoft.EntityFrameworkCore.DynamicLinq.DynamicFunctions) } }; var result = queryable.Where(config, "DynamicFunctions.Like(MyColumn, @0)", "%a%").ToList();
注意:此方案要求
Microsoft.EntityFrameworkCore.DynamicLinq与System.Linq.Dynamic.Core版本严格兼容,否则仍可能出现方法不存在的错误。
内容的提问来源于stack exchange,提问作者Stefan S.
相关产品推荐
相关产品推荐

