2016-08-03 15 views
0

Ich habe eine Methode wie diese (sehr vereinfachte Version):Wie Sie eine Methode ohne Parameter aufrufen, die den Ausdruck <Func <Model, String >>?

public static Expression<Func<MyModel, String>> GetSomeStatus() 
{ 
    return myModel => myModel.IsTrue ? "That's true" : "That's false"; 
} 

Also, wie kann ich es in der Aussage wie folgt aufrufen:

var efRequest = db.Table1.Where(...) 
          .Select(x => new MyAnotherModel 
          { 
           Status = ""; // call GetSomeStatus() here; x is of MyModel type 
          }) 

Hinweis: Meine erste Frage war einige Helfer rufen Methode, die String innerhalb Select Methode zurückgibt, aber natürlich habe ich Ausnahme wie Linq to entities doesn't recognize this method..., also habe ich versucht, es neu zu schreiben (siehe Beispiel oben), aber jetzt verstehe ich einfach nicht, wie man es nennt (ich bin relativ neu in EF). Ich weiß über einfache AsEnumerable Anruf vor Select, die mein erstes Problem löst, aber ich möchte diese Abfrage als IQueryable für spätere Zwecke behalten.

+0

Normalerweise kann man nicht. Können Sie Bibliotheken von Drittanbietern verwenden? –

+0

Ivan, ich könnte es versuchen. Wenn du einen kennst, teile es bitte mit mir. –

Antwort

1

Es ist nicht aus der Box möglich. Aber Sie können zum Beispiel LINQKitAsExpandable und Invoke Erweiterungsmethoden wie folgt verwenden:

Zuerst Sie den Ausdruck in einer Variablen speichern müssen, sonst werden Sie die berühmte Linq to entities doesn't recognize this method... Ausnahme erhalten:

var getSomeStatus = GetSomeStatus(); 

und dann verwenden es in der Abfrage (nach AsExpandable Aufruf, so wird der resultierende Abfrage Ausdrucksbaum richtig nachbearbeitet):

var efRequest = db.Table1.AsExpandable() 
    .Where(...) 
    .Select(x => new MyAnotherModel 
    { 
     Status = getSomeStatus.Invoke(x) 
    });