0

i am working with 4 fields but i may have to search 100 fields. so to mention 100 fields name in where is very cumbersome.

please suggest best approach when we search a value against all fields or few specific fields.

    if (!String.IsNullOrEmpty(SearchText))
    {
        customer = customer.Where(s => s.CompanyName.ToUpper().Contains(SearchText.ToUpper())
        || s.ContactName.ToUpper().Contains(SearchText.ToUpper())
        || s.ContactTitle.ToUpper().Contains(SearchText.ToUpper())
        || s.Address.ToUpper().Contains(SearchText.ToUpper()));
    }
Monojit Sarkar
  • 2,353
  • 8
  • 43
  • 94

1 Answers1

0

You can dynamically create predicate Expression:

if(!String.IsNullOrEmpty(SearchText))
{
    Expression orExpr = null;
    var arg = Expression.Parameter(typeof(Customer), "x");

    var strType = typeof(string);
    var ToUpperMeth = strType.GetMethods().Where(x => x.Name == nameof(string.ToUpper) 
                                          && x.GetParameters().Count() == 0).Single();
    var ContainsMeth = strType.GetMethods().Where(x => x.Name == nameof(string.Contains) 
                                          && x.GetParameters().Count() == 1).Single();

    var exprVal = Expression.Constant(SearchText);
    var toUpExprVal = Expression.Call(exprVal, ToUpperMeth);

    foreach (var prop in typeof(Customer)
        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
        .Where(x => x.PropertyType == strType))
    {
        var exprProp = Expression.Property(arg, prop.Name);
        var toUpExpr = Expression.Call(exprProp, ToUpperMeth);
        var contExpr = Expression.Call(toUpExpr, ContainsMeth, toUpExprVal);

        orExpr = orExpr == null ? (Expression)contExpr : Expression.Or(orExpr, contExpr);
    }
    var predicate = Expression.Lambda<Func<Customer, bool>>(orExpr, arg);

    customer = customer.Where(predicate);
}
Slava Utesinov
  • 13,410
  • 2
  • 19
  • 26
  • if possible please see my this post and help me with your suggestion https://stackoverflow.com/questions/48706148/ef-how-to-pass-column-name-dynamically-to-where-clause – Monojit Sarkar Feb 11 '18 at 18:57