Entity Framework 4: Eager Laden (Include) mit Filtern mit Self-Tracking-Entities

8

Ich habe eine Lösung, bei der ich Self-Tracking-Entitäten mithilfe der RTM-Vorlagen erstellt habe. Ich habe die Entitäten und den Kontext zwischen zwei Projekten aufgeteilt, damit ich die Typdefinitionen wiederverwenden kann, wenn ich Client / Server über WCF ausführen möchte.

Eine meiner Servicemethoden ist erforderlich, um ein Diagramm von "Produkt" -Objekten mit untergeordneten Objekten von "ProductSku" zurückzugeben, und diese wiederum haben untergeordnete Objekte von "ProductPrice". Die Auswahlkriterien lauten auf die Eigenschaft "Name" des Objekts "Produkt" und die Eigenschaft "FinancialPeriodID" des "ProductPriceObject". Momentan schließe ich den Namen nicht in die Suche ein, aber ich habe Probleme, den Graphen zurückzubringen.

Wenn ich einfach die folgende Abfrage ausführe (beachten Sie, dass diese Syntax aus LinqPad und nicht aus dem eigentlichen Anwendungscode stammt) ...

%Vor%

... dann kann ich das vollständige Objektdiagramm für die Elemente abrufen, die ich benötige, natürlich gibt es an dieser Stelle keinen Filter.

Wenn ich stattdessen den Filter wie folgt einführe ...

%Vor%

... was ich zurückbekomme, sind die "Produkt" -Objekte, die untergeordneten "ProductSku" -Objekte (die in der "Skus" -Kollektion des "Produkts" sind) und ihre "ProductPrice" -Objekte (die in der "PriceHistory" Sammlung des "ProductSku") - aber ich bekomme nur die "Product" Objekte zurück, die "Skus" Sammlung ist leer.

Ich habe auch versucht, die Abfrage als ...

zu codieren %Vor%

... aber das macht auch keinen Unterschied.

Natürlich muss ich etwas falsch machen. Kann irgendjemand etwas Licht auf das, was dieses Etwas ist, werfen, so wie ich es schon seit Stunden getan habe und jetzt im Kreis herumlaufe?

    
Martin Robins 29.08.2010, 16:12
quelle

4 Antworten

1

Vielleicht kann Projektion diesen Trick?

Sehen Sie sich die Linq-Filtersammlung mit EF

an     
Devart 31.08.2010 10:59
quelle
1

Bearbeiten:

Was ist mit:

%Vor%

Include führt bereits alle notwendigen Aufgaben aus, um die Navigationseigenschaften zu füllen, so dass zusätzliche Joins für die Bedingung nicht benötigt werden. Was noch wichtiger ist, jede manuelle Verknüpfung oder Projektion ändert die Form der Abfrage und Include wird nicht verwendet.

Achten Sie auch darauf, dass die Bedingung nur Produkte filtert. Die von Include geladenen Daten werden nicht gefiltert. Sie erhalten alle Produkte mit mindestens einem SKU mit einer Preishistorie mit der ID 244 für die finanzielle Periode, aber bei diesen Produkten werden alle Skus- und Preishistorien geladen. EF unterstützt derzeit nicht das Filtern nach Include. Wenn Sie auch gefilterte Beziehungen benötigen, müssen Sie separate Abfragen ausführen, um sie zu erhalten.

    
Ladislav Mrnka 29.08.2010 16:32
quelle
0

Das Einschließen ist keine Garantie für das eifrige Laden und es könnte aus dem folgenden Grund stillschweigend ignoriert werden. Es ist besser in diesem Thread erklärt. Sie können die Tabelle, die Sie laden möchten, manuell auswählen, z. B.

%Vor%

Ссылка

  • Include gilt nur für Elemente in den Abfrageergebnissen: Objekte, die auf die äußerste Operation in der Abfrage projiziert.
  • Der Typ der Ergebnisse muss ein Entitätstyp sein.
  • Die Abfrage darf keine Operationen enthalten, die den Typ des Attributs ändern Ergebnis zwischen Include und der äußersten Operation (d. h. eine GroupBy () oder eine Select () -Operation, die den Ergebnistyp ändert)
  • Der Parameter Include ist ein durch Punkte begrenzter Navigationspfad Eigenschaften, die von einer Instanz des Typs aus navigierbar sein müssen bei der äußersten Operation zurückgegeben
user1094140 28.02.2018 23:58
quelle
-1

Self-Tracking-Entities sind nicht zum verzögerten Laden aktiviert. Aus diesem Grund ist die Sammlung nicht leer mit der Standard-Entity-Generierung und nicht mit STE. Tatsächlich lädt Ihr Include niemals verbundene Entitäten, wenn Sie sie in der Abfrage verwenden. Jetzt ist Ihre L2E-Abfrage nicht korrekt. Ich denke, dass du so etwas tun willst:

%Vor%

Ich hoffe, das hilft

Matthieu

    
Matthieu MEZIL 01.09.2010 12:04
quelle