Hallo, ich versuche, DefaultIfEmpty()
function auf IQueryable
zu verwenden, und es wird eine Ausnahme ausgelöst. "Nicht unterstützte Überladung wird für den Abfrageoperator 'DefaultIfEmpty' verwendet."
Das ist mein Code:
Ich habe einen anderen Weg gefunden, es ohne DefaultIfEmpty
zu machen, aber ich möchte immer noch wissen, wie ich das lösen kann ... hier ist der erste Teil der Ausnahme:
Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für weitere Informationen über den Fehler und wo es aus dem Code stammt.
Ausnahmedetails: System.NotSupportedException: Nicht unterstützte Überladung für den Abfrageoperator 'DefaultIfEmpty'.
Es scheint mir ziemlich selbsterklärend zu sein:
Nicht unterstützte Überladung für den Abfrageoperator 'DefaultIfEmpty'
Klingt wie Ihr LINQ-Provider (den Sie nicht angegeben haben) die Überladung von DefaultIfEmpty
nicht unterstützt, die einen Standardwert verwendet.
Die einfachste Alternative ist wahrscheinlich zu verwenden:
%Vor%Beachten Sie, dass dieser Ansatz das Abrufen des "Standard" Abendessens vermeidet, es sei denn es ist erforderlich, also ist es auch effizienter.
(Wenn es für eine ID nur ein einziges Ergebnis geben sollte, sollten Sie übrigens SingleOrDefault
anstelle von FirstOrDefault
verwenden. Das ist logischer.)
Die Methode DefaultIfEmpty
gibt NotSupportedException
aus, wenn sie in IQueryable<T>
aufgerufen wird. Sie könnten eine explizite Umwandlung in IEnumerable<T>
durchführen, indem Sie db.Dinners.Where(d => d.DinnerId == id).ToEnumerable().First()
aufrufen.
Sie sollten diese Methode wahrscheinlich nicht verwenden . Es ist besser, nur zu überprüfen, ob der Aufruf irgendwelche Werte zurückgegeben hat, und den Standard wiederherzustellen, wenn dies nicht der Fall ist.
Bearbeiten : Oop. Nein, Jon Skeet hat Recht. Die DefaultIfEmpty
-Verlängerungsmethode basiert auf einer Implementierung des Abfrageanbieters. Daher hängt sie definitiv davon ab, welcher Abfrageanbieter verwendet wird.