2013-08-22 9 views
8

Po prostu chcę zbudować filtry dynamiczne. I wreszcie powrócićJak przekonwertować IQueryable <T> na wyrażenie <Func <T, bool>>?

Expression<Func<Event, bool>> 

Próbowałem używać kombajnu (AndAlso) wyrażenia, ale nie było workin iw końcu stwierdziliśmy, że istnieją IQueryable kwerend, który działa dobrze, ale teraz jak mogę przekonwertować to z typem powrotu -

Expression<Func<Event, bool>>? 

Mój kod:

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

Spójrz na zaktualizowana odpowiedź (myślę, że już ją zaakceptowałeś i nie masz pewności, że wciąż otrzymujesz powiadomienie w tej sprawie), która bierze pod uwagę komentarz Floriana. – Sam

Odpowiedz

6

jakiegoś powodu nie wystarczy wykonać następujące czynności:

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; 
} 

Jak powiedział Florian w komentarzu, należy unikać zwracania IQueryables (jeśli to możliwe). Proste rozwiązanie jest, aby powrócić do listy zamiast:

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

Och, to było naprawdę łatwe, teraz działa, dziękuję bardzo :) –

+0

To przecieka jeszcze nie ocenionego IQueryable, co może skutkować nieoczekiwanymi rezultatami. Ponieważ zakres 'search' nie jest ustawiony na' GetBySearch' -> Bad Practice – LunicLynx

+1

@FlorianDohrendorf True. Łatwo jest naprawić, jeśli zwrócisz funkcję 'List ' i 'return query.ToList()'. O ile nie potrzebujesz tego IQueryable, to byłaby droga do zrobienia. Będę edytować to w. – Sam

2

Ta konwersja nie jest ważna, ponieważ Where zamienia go na MethodCallExpression

Byłoby to ważne:

MethodCallExpression e = query.Expression as MethodCallExpression;