2016-06-27 7 views
2

Ich habe mit dem linq seine Func Parameter (auf Entity Framework) herumspielen. Dann fand ich dieses Verhalten ausMehrere func Parameter für LINQ - EF

var idMatchQuery = new Func<MyClass, bool>(x => x.Id == someId); 
var statusMatchQuery = new Func<MyClass, bool>(x => x.Status == someStatus); 

/// works 
var a = myClassEntity.FirstOrDefault(idMatchQuery); 

/// doesn't work 
var b = myClassEntity.FirstOrDefault(p => idMatchQuery(p) && statusMatchQuery(p)); 

/// doesn't work 
var c = myClassEntity.FirstOrDefault(p => idMatchQuery(p) && p.Status == 1); 

Es wirft UnsupportedOperationException seit dem EF nicht diese Abfragen erkennen. Ich könnte es viel einfacher akzeptieren, wenn keiner der oben genannten nicht funktionierte. Aber es nervt mich, wenn es mit einer einzigen Abfrage arbeitet, aber nicht mit Kombinationen mit anderen Abfragen.

Ich bin sicher, es gibt eine Erklärung dafür, aber ich denke, meine Suchbegriffe waren zu naiv für die Antwort, die ich suche.

Was ist die Erklärung für dieses Verhalten?

+0

Ob die erste Version "funktioniert" ist fraglich, weil es in 'Enumerable.FirstOrDefault' Aufruf, nicht die' Queryable' auflöst, so wird es die gesamte Tabelle im Speicher vor dem Anwenden Ihrer Funktion, was ich denke nicht was du erwartest. –

+0

Nun, wenn das der Fall ist, fühle ich mich jetzt nicht einmal in Ordnung. –

Antwort

4

Es wird verursacht, dass EF Ihr Prädikat in TSQL-Sprache übersetzen sollte. Sie können überprüfen, dass der Parameter FirstOrDefault Methode nicht Func<T, bool> ist, sondern stattdessen Expression<Func<T, bool>>, weil die letzte uns Gelegenheit gibt, es zu analysieren und in TSQL zu übersetzen. Wenn Sie zwei Func<T, bool> oder Func<T, bool> mit einfacher Bedingung verwenden EF kann nicht übersetzen und analysieren es in TSQL aufgrund Expression<Func<T, bool>> innere Sachen und Features Komplexität, deshalb EF halten diese Prädikate im Ursprungszustand und senden an Server, wie es zuerst geschrieben wurde, als Ergebnis - UnsupportedOperationException. Also, für EF - Parsen ersten Prädikat viel leichter als die anderen beiden.

Fazit: Es wird durch Features und Methodik der Übersetzung C# Prädikate von Expression<Func<T,bool>> zu TSQL verursacht, weil es manchmal genug hohe Komplexität ist.

+0

Ich verstehe. Klingt gültig. Lass mich es versuchen, und ich melde mich bei dir. –