【问题标题】:How to search based on contains using DynamicFilterBuilder in C#如何在 C# 中使用 DynamicFilterBuilder 基于包含进行搜索
【发布时间】:2021-10-21 17:43:17
【问题描述】:

在我的项目中,目前我已经使用下面的函数代码实现了多次搜索:

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
                    predicate.And(item.key,
                      DynamicExpressions.FilterOperator.Contains, item.value);
            }
        }

        return source.Where(predicate.Build());
    }

但它的工作方式只像区分大小写意味着我需要准确地传递名称 ex : "Data" 如果我​​传递了 "data" 它不会返回任何东西,所以有人可以帮助我吗?

【问题讨论】:

  • DynamicExpressions 和 DynamicFilterBuilder 来自哪个包?是否有“LIKE”过滤运算符?
  • @Christopher Hamkins 不,没有可用的“LIKE”过滤器 DynamicExpressions 是新功能。
  • @检查下面的链接以获取包装和详细信息github.com/zHaytam/DynamicExpressions

标签: c# asp.net-core .net-core


【解决方案1】:

您可以在此处进行小写转换并与下面的小写进行比较:

  if (item.key.ToLower() == "createdon")
    {
         //Your stuff
    }

【讨论】:

  • 感谢您的回复,但我正在根据 item.value 进行搜索,如果日期条件正常,只是名称有问题,例如我通过“Dnyanesh”然后工作但如果我通过了“dnyanesh”返回空列表。
【解决方案2】:

评论中提到的 zHaytam 的包 ( github.com/zHaytam/DynamicExpressions) 在 GitHub 上是开源的,因此我们可以看到在其实现(类 DynamicExpressions)中,表达式被委托给 Linq 表达式:

private static Expression CreateFilter(MemberExpression prop, FilterOperator op, ConstantExpression constant)
        {
            return op switch
            {
                FilterOperator.Equals => Expression.Equal(prop, constant),
                FilterOperator.GreaterThan => Expression.GreaterThan(prop, constant),
                FilterOperator.LessThan => Expression.LessThan(prop, constant),
                FilterOperator.Contains => Expression.Call(prop, _containsMethod, PrepareConstant(constant)),
                FilterOperator.StartsWith => Expression.Call(prop, _startsWithMethod, PrepareConstant(constant)),
                FilterOperator.EndsWith => Expression.Call(prop, _endsWithMethod, PrepareConstant(constant)),
                FilterOperator.DoesntEqual => Expression.NotEqual(prop, constant),
                FilterOperator.GreaterThanOrEqual => Expression.GreaterThanOrEqual(prop, constant),
                FilterOperator.LessThanOrEqual => Expression.LessThanOrEqual(prop, constant),
                _ => throw new NotImplementedException()
            };
        }

containsMethod 使用public bool Contains (string value); 的版本string.Contains

        private static readonly MethodInfo _containsMethod = typeof(string).GetMethod("Contains"
            , new Type[] { typeof(string) });

为了让“Contains”方法变得不区分大小写,我想你可以下载并修改zHaytam的代码:

在方法DynamicExpressions中修改_containsMethod 的初始化表达式以引用public bool Contains (string value, StringComparison comparisonType)版本的string.Contains

        private static readonly MethodInfo _containsMethod = typeof(string).GetMethod("Contains"
            , new Type[] { typeof(string), typeof(StringComparison) });

并修改CreateFilter 方法以提供附加参数以忽略大小写:

FilterOperator.Contains => Expression.Call(prop, _containsMethod, PrepareConstant(constant), Expression.Constant(StringComparison.OrdinalIgnoreCase)),

【讨论】:

  • 感谢我下载并修改zHaytam的代码的解决方案也提高了公关。
猜你喜欢
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
相关资源
最近更新 更多