2013-08-25 4 views
1

Мне нужно построить поиск по имени поля строки.Поиск по имени поля строки

Например, этот код:

SearchProvider.Search(records, "First", "S2"); 

должны быть равны:

SearchProvider.Search(records, x => x.First, "S2"); 

Проблема: преобразование строки в лямбда-выражения Linq.

Как я могу это сделать?

ответ

2

Вы должны преобразовать строку в лямбда-выражения, используя Expression.Lambda, например:

public IQueryable<TModel> Search<TModel>(IQueryable<TModel> model, string selector, string searchFor) 
{ 
    var param = Expression.Parameter(typeof(TModel), "x"); 
     var contains = Expression.Call(
      Expression.PropertyOrField(param, selector), 
      "Contains", null, Expression.Constant(searchFor) 
     ); 
     var predicate = Expression.Lambda<Func<TModel, bool>>(contains, param); 

     model = model.Where(predicate); 
    return model; 
} 

Следующая за честную поиска вы должны сделать две вещи:

  • Поиск любого объекта не только строки.
  • Опустить все строки.

Вот пример:

public IQueryable<TModel> Search<TModel>(IQueryable<TModel> model, string selector, object searchFor) 
{ 
    var param = Expression.Parameter(typeof(TModel), "x"); 
    var tostring = Expression.Call(
     Expression.PropertyOrField(param, selector), 
     "ToString", null, null 
     ); 
    var tolower = Expression.Call(
     tostring, 
     "ToLower", null, null 
     ); 
    var contains = Expression.Call(
     tolower, 
     "Contains", null, Expression.Constant(searchFor) 
       ); 
    var predicate = Expression.Lambda<Func<TModel, bool>>(contains, param); 

    model = model.Where(predicate); 

     return model; 
} 

удачи.

Смежные вопросы