Hier ist mein Ausdruck:
%Vor% Ich weiß, dass die Ursache Where(m => m.IsDeleted == false)
im Modulabschnitt ist, aber warum verursacht es den Fehler? Noch wichtiger, wie repariere ich es?
Wenn ich die WHERE-Klausel entferne, funktioniert es gut, aber ich möchte gelöschte Module herausfiltern.
.Include
wird verwendet, um verwandte Entitäten aus der Datenbank zu laden. I.e. Stellen Sie in Ihrem Fall sicher, dass die Daten für Module und Labs mit dem Kurs geladen sind.
Der lamba-Ausdruck in der .Include
sollte Entity Framework mitteilen, welche verwandte Tabelle enthalten ist.
In Ihrem Fall versuchen Sie auch, eine Bedingung innerhalb des Includes auszuführen, weshalb Sie einen Fehler erhalten.
Ihre Suchanfrage lautet wie folgt:
Finden Sie den Kurs, der zu einer bestimmten ID passt, mit dem zugehörigen Modul und der entsprechenden Übung. Solange das passende Modul und Kapitel nicht gelöscht werden.
Wenn das stimmt, dann sollte das funktionieren:
%Vor%aber warum verursacht es den Fehler?
Ich kann mir vorstellen, dass das EF-Team manchmal den Tag bedauert, an dem sie diese Include
-Syntax eingeführt haben. Die Lambda-Ausdrücke legen nahe, dass jeder gültige linq-Ausdruck verwendet werden kann, um das Eager-Laden subtil zu manipulieren. Aber schade, nicht so. Wie ich hier erklärte, dienen die Lambdas nur als verkapptes String-Argument für die zugrundeliegende "echte" Methode Include
.
Wie repariere ich es?
Am besten wäre es, in eine andere Klasse (etwa ein DTO) zu projizieren
%Vor%aber das könnte eine große Änderung für Sie sein.
Eine weitere Option ist das Deaktivieren des Lazy Loads und das Vorladen der nicht gelöschten Module und Kapitel des Kurses im Kontext durch die Befehl Load
. Relationship Fixup füllt die richtigen Navigationseigenschaften. Das Include
für Lab
funktioniert normal.
Übrigens gibt es eine Änderungsanforderung für diese Funktion.
Tags und Links asp.net-mvc-3 c# entity-framework entity-framework-5 lambda