Динамическое множественное предложение где в linq C#

У меня есть запрос запроса с использованием linq. В запросе есть несколько выражений where, где указывается возвращаемый список элементов, соответствующих имени и городу. Ниже приведен фрагмент кода, который я использовал для предложения множественного оператора where, но он возвращает пустой набор элементов. wherefield содержит список имен полей, таких как name; город wherefieldValue содержит список значений полей, таких как 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 ответ

Ваш пример работает. Конечно, это работает только для строковых свойств, но я предполагаю, что это ваш вариант использования. Возможно, это не дает того, чего вы хотите достичь, потому что вы комбинируете свое предложение с и, но на самом деле вы хотите сделать это с помощью Или, просто измените эту строку кода:

combined = Expression.And(combined, e1);

к

combined = Expression.Or(combined, e1);
Другие вопросы по тегам