How to create predicate dynamically

后端 未结 3 1665
感动是毒
感动是毒 2020-12-17 19:23

Hi i want to create a list based on the search string using predicate expressions.

I have a list of type products contains different names.

List

相关标签:
3条回答
  • 2020-12-17 19:42

    Initialize the predicate as false

    Expression<Func<products, bool>> predicate = PredicateBuilder.False<products>();
    

    You need to combine the predicates using Or

    foreach (string str in SearchItems)
    {
        string temp = str;
        predicate = predicate.Or(p => p.NameToLower().Contains(temp.ToLower()));                   
    }
    

    Source for predicate builder here. It is part of LINQKit

    Code, in case link goes

    using System;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Collections.Generic;
    
    public static class PredicateBuilder
    {
      public static Expression<Func<T, bool>> True<T> ()  { return f => true;  }
      public static Expression<Func<T, bool>> False<T> () { return f => false; }
    
      public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
                                                          Expression<Func<T, bool>> expr2)
      {
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
              (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
      }
    
      public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
                                                           Expression<Func<T, bool>> expr2)
      {
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
              (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
      }
    }
    
    0 讨论(0)
  • 2020-12-17 19:57

    As I am not sure that predicate instance has an And method, I suggest you use this code:

    var list = list1.AsQueryable();
    foreach (string str in SearchItems)
    {
         list = list.Where(p => p.Name.ToLower().Contains(str.ToLower()));
    }
    listBox1.ItemsSource = list.ToList();
    
    0 讨论(0)
  • 2020-12-17 20:04

    You don't have to build a predicate here. You can try something like this

    List<products> list1 = new List<products>();
    
    list1.Add(new products("sowmya"));
    list1.Add(new products("Jane"));
    list1.Add(new products("John"));
    list1.Add(new products("kumar"));
    list1.Add(new products("ramya"));
    
    string input = "aaa+kuma+ram";
    List<string> searchStrings =
        input.Split(new string[] { "+" }, StringSplitOptions.None)
        .Select(s => s.ToLower())
        .ToList();
    
    List<products> list2 = (
        from p in list1
        where searchStrings.Any(s => p.Name.Contains(s))
        select p).ToList();
    

    list2 will contain "kumar" and "ramya".

    0 讨论(0)
提交回复
热议问题