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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:27:03