2 Stimmen

LINQ to Entity Framework Many-Many Eager Loading Problem

Ich habe die folgende Frage:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              select e;

Und alles funktioniert, ich bekomme meine Ausrüstungen und die Tabelle der Hersteller wird korrekt geladen (eifrig). Aber wenn ich versuche, die folgende Many-to-many-Abfrage zu machen:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              from cce in e.ContractEquipments
              where cce.Contracts.EndedOn >= DateTime.Today
              select e;

wobei "ContractEquipments" eine Many-to-many-Suche zwischen "Equipments" und "Contracts" ist, aber wenn diese Abfrage ausgeführt wird, wird die Tabelle "Manufacturers" nicht mehr einfach geladen. Irgendeine Idee, wie man dies beheben kann, ohne das Folgende zu tun:

if (MyEntity.Manufacturers.IsLoaded == false) 
   MyEntity.ManufacturersReference.Load()

Die Ausführung dieses Projekts dauert Stunden, und ich möchte die Anzahl der Datenbankaufrufe gering halten.

EDIT #1:

Ich habe dies auch ohne Erfolg versucht:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              join cce in ContractContext.ContractEquipments 
                on e.ID equals cce.Equipments.ID
              where cce.Contracts.EndedOn >= DateTime.Today
              select e;

7voto

Alex James Punkte 20783

Frühe Einschlüsse gehen bei einigen Abfragetypen oft verloren (z. B. bei zusätzlichen Verknüpfungen usw.)

Der Weg, um dies zu umgehen, ist die Abfrage zu tun, (und dann so lange, wie Sie zurückgeben Entitäten z.B. Select e anstatt eine Projektion z.B. Select new {...}) Sie können Cast zu ObjectQuery und tun die Einbeziehung um die Außenseite:

var MyQuery = ((from e in ContractContext.Equipments
              where e.Customers.ID == customer.ID
              from cce in e.ContractEquipments
              where cce.Contracts.EndedOn >= DateTime.Today
              select e) as ObjectQuery<Equipment>).Include("Manufacturers");

Das sollte funktionieren.

Wenn Sie an weiteren Informationen zu diesem Thema interessiert sind, besuchen Sie Tipp 22 - Wie man Include wirklich Include macht

Alex

0 Stimmen

Ich frage mich nur, ob es nicht Sinn und Zweck eines frühen Include ist, eine Art von Funktionalität zu dieser Entität innerhalb der Abfrage selbst hinzuzufügen? Wenn Sie z. B. Include("Manufacturers") in die Where-Klausel einfügen wollten, um eine Liste der verwandten Hersteller in New York zu erhalten.

0voto

bytebender Punkte 7216

Haben Sie stattdessen eine Verbindung wie diese versucht?

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              join cce in e.ContractEquipments on e.Id equals cce.EquipmentId
              where cce.Contracts.EndedOn >= DateTime.Today
              select e;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X