C#使用DynamicFilterBuilder实现包含查询时如何解决大小写敏感问题
多条件检索大小写不敏感匹配解决方案
当前实现默认使用区分大小写的字符串匹配逻辑,可根据你的技术栈选择以下适配方案:
方案1:统一转换大小写匹配(兼容绝大多数ORM/动态过滤库场景)
将查询字段和检索值统一转为小写/大写后再做包含匹配,修改你的过滤逻辑如下:
public static IQueryable<T> Filter<T>(this IQueryable<T> source, SearchCriteria searchCriteria) { var predicate = new DynamicFilterBuilder<T>(); foreach (var item in searchCriteria.filters) { if (!string.IsNullOrEmpty(item.key)) { if (item.key == "CreatedOn") predicate.And(item.key, DynamicExpressions.FilterOperator.GreaterThanOrEqual, DateTime.ParseExact(item.value.ToString() + " 00:00:00", "yyyy-MM-dd HH:mm:ss", null)) .And(item.key, DynamicExpressions.FilterOperator.LessThanOrEqual, DateTime.ParseExact(item.value.ToString() + " 23:59:59", "yyyy-MM-dd HH:mm:ss", null)); else { // 检索值先转小写,同时指定字段调用ToLower方法后做匹配 var lowerSearchValue = item.value?.ToString()?.ToLower(); predicate.And($"{item.key}.ToLower()", DynamicExpressions.FilterOperator.Contains, lowerSearchValue); } } } return source.Where(predicate.Build()); }
注意:如果你的DynamicFilterBuilder不支持在属性名后拼接.ToLower()写法,可先检查库的文档,是否支持传入表达式转换规则,或者直接调整动态表达式构建逻辑。
方案2:使用库内置的忽略大小写运算符
如果你的DynamicExpressions库提供了忽略大小写的包含运算符,直接替换原有运算符即可:
predicate.And(item.key, DynamicExpressions.FilterOperator.ContainsIgnoreCase, item.value);
方案3:数据库层面配置(仅ORM转SQL查询场景适用)
如果你的查询是通过EF Core等ORM转成SQL执行,可直接将对应字符串字段的排序规则配置为不区分大小写(一般后缀带_CI的排序规则即为忽略大小写),无需修改业务代码,原生的Contains查询默认就会忽略大小写。
注意事项
- 不要在ORM转SQL的场景中使用
StringComparison.OrdinalIgnoreCase参数,绝大多数ORM无法将该参数转成原生SQL,会触发全表数据加载到内存做过滤,严重影响性能。 - 做大小写转换时需做空值判断,避免空引用异常。
内容的提问来源于stack exchange,提问作者DnyaneshSurya
相关产品推荐
相关产品推荐

