2013-08-22 3 views
8

Я просто хочу создать динамические фильтры. И, наконец, вернутьсяКак преобразовать IQueryable <T> в выражение <Func <T, bool>>?

Expression<Func<Event, bool>> 

Я пытался использовать Синдикат (AndAlso) выражения, но не работает и, наконец, я обнаружил, что есть IQueryable запросов которых работает хорошо, но теперь, как я могу конвертировать это тип возвращаемого значения -

Expression<Func<Event, bool>>? 

Мой код:

public IQueryable<Event> GetBySearch(EventFilter search) 
    { 
     IQueryable<Event> query = this.Context.Events.AsQueryable(); 
     Expression<Func<Event, bool>> expression = null; 

     if (search.CategoryId != 0) 
     { 
      query = query.Where(x => x.CategoryId == search.CategoryId); 
     } 

     if (search.SubCategoryId != 0) 
     { 
      query = query.Where(x => x.SubCategoryId == search.SubCategoryId); 
     } 

     expression = query.Expression as Expression<Func<Event, bool>>; //This convert is not working, it returns null. 

     return this.Context.Events.Where(expression); 
    } 
+0

Посмотрите на обновленный ответ (я думаю, вы уже приняли его, но не уверены, что он все равно получит уведомление в этом случае), который учитывает комментарий Флориана. – Sam

ответ

6

Любая причина вы не просто сделать следующее:

public IQueryable<Event> GetBySearch(EventFilter search) 
{ 
    IQueryable<Event> query = this.Context.Events.AsQueryable(); 

    if (search.CategoryId != 0) 
    { 
     query = query.Where(x => x.CategoryId == search.CategoryId); 
    } 

    if (search.SubCategoryId != 0) 
    { 
     query = query.Where(x => x.SubCategoryId == search.SubCategoryId); 
    } 

    return query; 
} 

Как сказал Флориан в комментарии, возвращение IQueryables следует избегать (когда это возможно). Простое решение вернуть список вместо:

public List<Event> GetBySearch(EventFilter search) 
{ 
    IQueryable<Event> query = this.Context.Events.AsQueryable(); 

    if (search.CategoryId != 0) 
    { 
     query = query.Where(x => x.CategoryId == search.CategoryId); 
    } 

    if (search.SubCategoryId != 0) 
    { 
     query = query.Where(x => x.SubCategoryId == search.SubCategoryId); 
    } 

    return query.ToList(); 
} 
+0

О, это было очень просто, теперь это работает, спасибо вам большое :) –

+0

Это утечка не оцененного IQueryable, который может привести к неожиданным результатам. Потому что область поиска не привязана к 'GetBySearch' -> Плохая практика – LunicLynx

+1

@FlorianDohrendorf True. Легко фиксируется, если вы вернете функцию «Список » и 'return query.ToList()'. Если вам не понадобится этот IQueryable, это будет путь. Я отредактирую его. – Sam

2

Это преобразование не является действительным, поскольку Where преобразует его в MethodCallExpression

Это было бы справедливо:

MethodCallExpression e = query.Expression as MethodCallExpression; 
Смежные вопросы