2016-03-31 9 views
-1

Ich habe eine Klasse mit einer bool Verfahren, z.B .: bekamKann ich Vergleichselemente aus meinem Domänenmodell zuerst im Entity Framework-Code verwenden?

public bool IsInFuture() 
{ return this.Date > DateTime.Now; } 

Und ich speichern sie in einer Datenbank EF-Code Zuerst verwenden. Wenn ich werde versuchen, dieses Prädikat in Linq-Operationen verwendet wird, werde ich eine Ausnahme erhalten, da es nicht in SQL übersetzt werden kann:

await context.Where(order => order.IsInFuture()).ToListAsync(); 

, die Logik des Prädikats ziemlich kompliziert sein kann, und ich würde nicht gerne Dupliziere es in meinem Code. Kann ich Code in Linq-Operationen einbinden? Ich bin mir ziemlich sicher, dass dieses Problem eine Lösung hat.

Vielen Dank im Voraus!

+0

Warum muss dies eine Bool-Methode sein? Es sieht für mich nur eine Rückgabeeigenschaft aus, dann können Sie diese in Ihrem linq await-Kontext verwenden. Wo (order => order.IsInFuture) .ToListAsync(); –

+0

Dann muss ich diese Eigenschaften in einer Datenbank speichern. Und ich brauche sie zu berechnen. – Waldemar

+3

Sie können benutzerdefinierte Funktionen nicht verwenden. Sie können Ausdrücke verwenden, sie müssen jedoch in SQL übersetzt werden können. –

Antwort

0

Sie können das Prädikat nicht direkt verwenden. Wie sollte EF wissen, wie man es in eine SQL WHERE-Anweisung konvertiert?

Sie haben ein paar Alternativen:

  • die Abfrage Rephrase Standardoperationen zu verwenden, z.B. kleiner als. Dies wird jedoch die Logik aus dem Prädikat duplizieren.
  • Verwenden Sie eine Raw-SQL-Abfrage. Dies wird auch die Logik duplizieren, aber in SQL.
  • Laden Sie die gesamte Liste der Entitäten und filtern Sie dann im Speicher (d. H. Where() nach ToList()). So können Sie das Prädikat wiederverwenden. Beachten Sie, dass dies nur eine sehr gute Idee für sehr kleine Datensätze ist.
+0

Ich habe eine Idee, die Prädikatfunktion zu zwingen, inline zu sein. In der Theorie sollte dies helfen. Ich werde versuchen, es in mehreren Tagen zu tun. Vielleicht hat jemand eine Erfahrung und kann sie teilen? – Waldemar