Использование PredicateBuilder для построения поиска запросов по нескольким столбцам Entity

У меня есть список имен полей. Я пытаюсь создать предикат для просмотра полей, чтобы увидеть, содержат ли они поисковый запрос. Я прошел путь, указанный в этом исходный вопрос, но не понимаю, как сделать Содержит вместо NotEqual.

string searchTerm = "Fred";    
foreach (var field in FieldNames)
{
    myPredicate= myPredicate.And(m => m.*field*.Contains(searchTerm));                    
} 

Мой код до сих пор:

public static Expression<Func<T, bool>> MultiColumnSearchExpression<T>(string fieldName,string searchValue)
{
    var parameter = Expression.Parameter(typeof(T), "m");
    var fieldAccess = Expression.PropertyOrField(parameter, fieldName);
   //this next line should do a Contains rather then NotEqual but how?
    var body = Expression.NotEqual(fieldAccess, nullValue);

    var expr = Expression.Lambda<Func<T, bool>>(body, parameter);
    return expr;
}

person John S    schedule 28.04.2017    source источник


Ответы (2)



Expression.NotEqual — это бинарный оператор !=. Поскольку ваш вызов Contains не является бинарным оператором, для него нет прямой замены.

Вместо этого вам нужно вызвать метод Contains. Итак, сначала вам нужно получить объект MethodInfo для функции string.Contains.

Это должно выглядеть так:

var method = typeof(string).GetMethod("Contains");
var body = Expression.Call(fieldAccess, method, Expression.Constant(searchValue));
person poke    schedule 28.04.2017