2017-01-06 10 views
0


Я создал общую функцию выражения лямбда, как показано ниже.
Я пытаюсь создать запрос динамического фильтра.
как применять метод string.contains в общем выражении лямбда

public Expression<Func<TSource, bool>> GenericExpression<TSource>(string propertyName, string searchTerm) 
    { 
     //x=>x.Name.Contains("Emre"); 
     var parameter = Expression.Parameter(typeof(TSource), "x"); 
     var property = Expression.Property(parameter,propertyName); 
     var search = Expression.Constant(searchTerm,typeof(string)); 
     MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
     var containsMethodExp = Expression.Call(property, method, search); 

     return Expression.Lambda<Func<TSource, bool>>(containsMethodExp, parameter); 
    } 

Я получаю сообщение об ошибке, когда функция вызова GenericExpression. сообщение об ошибке говорит, что:

Метод 'Логическое Contains (System.String)' объявлена ​​типа 'System.String' не может быть вызван с экземпляром типа 'System.Int32'

I Не понимаю детали ошибки.
Не могли бы вы объяснить, что
Спасибо

+1

Похоже, вы пытаетесь применить это выражение фильтра в числовом столбце. –

+0

hımm yes right. Я применяю эту функцию в «цикле foreach», а первый тип аргумента - числовой. Другими являются строки. В этой ситуации невозможно ввести числовой тип в строку. спасибо – mrkiyak

+0

Так что мне нужно сначала применить метод ToString – mrkiyak

ответ

0

Ошибка исправлена. Мы должны проверить тип аргумента перед вызовом метода через PropertyInfo.PropertyType. Он работает сейчас.

public IQueryable<T> Search<T>(DbSet<T> dbSet, string searchTerm, IGridItem gridItemType) where T : class 
    { 
     var query = new SearchQuery<T>().Query; 
     query = dbSet; 
     var gridItemFields = gridItemType.GetType().GetProperties(); 

     foreach (var field in gridItemFields) 
     { 
      if (field.PropertyType == typeof(String)) 
      { 
       string _nameProperty = typeof(T).GetProperty(field.Name).Name; 
       var lambda = GenericExpression<T>(_nameProperty, searchTerm); 
       query = query.Where(lambda); 
      } 
     } 

     return query; 
    } 

public Expression<Func<TSource, bool>> GenericExpression<TSource>(string propertyName, string searchTerm) 
    { 
     //x=>x.Name.Contains("Emre"); 
     ParameterExpression parameter = Expression.Parameter(typeof(TSource), "x"); 
     Expression property = Expression.Property(parameter,propertyName); 
     var search = Expression.Constant(searchTerm,typeof(string)); 

     MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
     var containsMethodExp = Expression.Call(property, method, search); 

     return Expression.Lambda<Func<TSource, bool>>(containsMethodExp, parameter); 
    }