Dynamic multiple where clause in linq c#

c# expression-trees linq reflection where-clause

Question

I have a request query using linq. The query has multiple where clause say return list of items matching name and city. Below is the piece of code I used for multiple where clause, but it returns empty set of items. wherefield contains list of field names like name;city wherefieldValue contains list of field values like james;delhi

 var where = FilterLinq<T>.GetWherePredicate(wherefield, wherefieldvalue).Compile();
 items = items.Where(where).OrderByDescending(a => a.GetType().GetProperty(field).GetValue(a, null)).Skip

 public class FilterLinq<T>
 {
    public static Expression<Func<T, Boolean>> GetWherePredicate(string whereFieldList, string whereFieldValues)
    {
        //the 'IN' parameter for expression ie T=> condition
        ParameterExpression pe = Expression.Parameter(typeof(T), typeof(T).Name);

        //combine them with and 1=1 Like no expression
        Expression combined = null;
        if (whereFieldList != null)
        {
            string[] field = whereFieldList.Split(';');
            string[] fieldValue = whereFieldValues.Split(';');
            for (int i = 0; i < field.Count(); i++)
            {
                //Expression for accessing Fields name property
                Expression columnNameProperty = Expression.Property(pe, field[i]);

                //the name constant to match 
                Expression columnValue = Expression.Constant(fieldValue[i]);

                //the first expression: PatientantLastName = ?
                Expression e1 = Expression.Equal(columnNameProperty, columnValue);

                if (combined == null)
                {
                    combined = e1;
                }
                else
                {
                    combined = Expression.And(combined, e1);
                }
            }
        }

        //create and return the predicate
        return Expression.Lambda<Func<T, Boolean>>(combined, new ParameterExpression[] { pe });
    }
}
1
3
1/11/2017 9:57:40 AM

Popular Answer

Your example works. Sure it works only for string properties, but i assume, that is your use case. Perhaps it doesn't do what you want to achieve, becasue you combine your clause with and, but actually you do want to do it with Or, jus change this code line :

combined = Expression.And(combined, e1);

To

combined = Expression.Or(combined, e1);
0
1/11/2017 11:05:28 AM


Related Questions





Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow