2013-08-22 3 views
8

Voglio solo creare un filtro dinamico. E infine per tornareCome convertire IQueryable <T> in Expression <Func <T, bool>>?

Expression<Func<Event, bool>> 

Ho cercato di utilizzare i combinare espressioni (AndAlso), ma non è stato workin e alla fine ho scoperto che ci sono query IQueryable che funziona bene, ma ora come posso convertire al tipo di ritorno -

Expression<Func<Event, bool>>? 

il mio codice:

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

Date un'occhiata al aggiornato rispondi (penso che tu l'abbia già accettato e non sei sicuro che continui a ricevere notifiche in quel caso) che tenga conto del commento di Florian. – Sam

risposta

6

Qual è il motivo non basta fare il seguente:

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

Come ha detto Florian nel commento, restituire IQueryables deve essere evitato (quando possibile). La soluzione più semplice è quella di restituire un elenco invece:

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

Oh, questo è stato davvero facile, ora funziona, grazie mille :) –

+0

Questo fa trapelare un IQueryable non ancora valutato che può quindi portare a risultati imprevisti. Poiché l'ambito di 'ricerca' non è fisso su' GetBySearch' -> Cattiva pratica – LunicLynx

+1

@FlorianDohrendorf True. Facilmente risolto se si effettua la funzione restituire un 'Elenco ' e 'return query.ToList()'. A meno che tu non abbia davvero bisogno di quella IQueryable quella sarebbe la strada da percorrere. Lo modificherò in – Sam

2

Questa conversione non è valido perché Where converte in un MethodCallExpression

Questo sarebbe valida:

MethodCallExpression e = query.Expression as MethodCallExpression;