2013-08-22 22 views
8

Ich möchte nur einen dynamischen Filter erstellen. Und schließlichWie konvertiert man IQueryable <T> in Ausdruck <Func <T, bool>>?

Expression<Func<Event, bool>> 

ich das Kombinat (AndAlso) Ausdrücke zu verwenden, haben zurückzukehren versucht, aber es war nicht workin und schließlich fand ich, dass es IQueryable Abfragen sind, die gut funktioniert, aber jetzt, wie kann ich konvertieren es dem Rückgabetyp -

Expression<Func<Event, bool>>? 

Mein Code:

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

Werfen Sie einen Blick auf die aktualisierte Antwort (ich glaube, Sie haben es bereits akzeptiert und ich bin mir nicht sicher, ob Sie in diesem Fall trotzdem benachrichtigt werden), die Florians Kommentar berücksichtigt. – Sam

Antwort

6

Gibt es Gründe, die Sie gerade folgendes nicht tun:

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

Wie Florian in dem Kommentar sagte, ist die Rückgabe von IQueryables (wenn möglich) zu vermeiden. Die einfache Lösung ist es, eine Liste zurückzukehren statt:

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, das war wirklich einfach, jetzt klappt es, vielen Dank :) –

+0

Das führt zu einem noch nicht gewerteten IQueryable, was dann zu unerwarteten Ergebnissen führen kann. Weil der Umfang von 'search' nicht auf' GetBySearch' festgelegt ist -> Bad Practice – LunicLynx

+1

@FlorianDohrendorf Richtig. Leicht zu beheben, wenn Sie die Funktion veranlassen, eine 'List ' und 'return query.ToList()' zurückzugeben. Es sei denn, Sie benötigen das IQueryable, das wäre der richtige Weg. Ich werde es bearbeiten. – Sam

2

Diese Umwandlung ist nicht gültig, weil Where es in ein

MethodCallExpression

konvertiert Dies wäre gültig:

MethodCallExpression e = query.Expression as MethodCallExpression; 
Verwandte Themen