46 Stimmen

Wie konstruieren Sie eine LINQ to Entities-Abfrage, um untergeordnete Objekte direkt zu laden, anstatt eine Reference-Eigenschaft oder Load() aufzurufen?

Ich bin neu bei der Verwendung von LINQ to Entities (oder Entity Framework, was auch immer sie es nennen) und ich schreibe eine Menge Code wie diese:

var item = (from InventoryItem item in db.Inventory
            where item.ID == id
            select item).First<InventoryItem>();

und dann Methoden für dieses Objekt wie folgt aufrufen:

var type = item.ItemTypeReference;

ou

var orders = item.OrderLineItems.Load();

um untergeordnete oder verwandte Objekte abzurufen.

Ich habe nicht die DB profiliert oder zu tief gegraben, aber meine Vermutung ist, dass, wenn ich eine .Load() oder eine *Reference-Eigenschaft aufrufen, ich tatsächlich einen anderen Aufruf an die DB mache. Wenn dies der Fall ist, gibt es eine Möglichkeit, diese Objekte in meinem ursprünglichen LINQ-Ausdruck zu erhalten?

66voto

Robert Wagner Punkte 16985

Sie möchten die Referenzen der Methode .Include(string) in diesem Fall verwenden "Gestaltung von Abfrageergebnissen" Artikel.

var item = from InventoryItem item in
              db.Inventory.Include("ItemTypeReference").Include("OrderLineItems")
           where item.ID == id
           select item;

Wahrscheinlich gibt es auch eine "Sql"-Syntax für die Includes.

Siehe auch dies Artikel über den Übergang von LINQ-to-SQL zu LINQ-to-Entities.

Für andere, die nach einer Lösung für dieses Problem suchen Linq to SQL möchten Sie Folgendes tun (ersetzen Sie DataContext und andere Typen durch die bei Ihnen vorhandenen):

using (DataContext db = new DataContext())
{
    DataLoadOptions options = new DataLoadOptions();
    options.LoadWith<InventoryItem>(ii => ii.ItemTypeReference);
    options.LoadWith<InventoryItem>(ii => ii.OrderLineItems);
    db.LoadOptions = options;

    var item = from InventoryItem item in db.Inventory
               where item.ID == id
               select item;
}

Dadurch werden die in LoadWith angegebenen Eigenschaften immer dann geladen, wenn das übergeordnete Element (InventoryItem) für diesen bestimmten Kontext geladen wird.

Als Antwort auf einige weitere Fragen von James und Jesper finden Sie hier Frage

0 Stimmen

Warum hat die Datenbank bei mir keine LoadOptions-Eigenschaft (EF5)?

1 Stimmen

@mohsen Der zweite Teil der Antwort bezieht sich auf LINQ to SQL, ein inzwischen aufgegebenes Framework

0 Stimmen

Danke für den Link "Shaping query results"

0voto

Mike Chamberlain Punkte 34722

Zusätzlich zu Roberts Antwort sollten Sie sich diese Frage nach Optionen für eine Erweiterungsmethode ansehen, die es Ihnen ermöglicht, .Include() mit einem Ausdruck anstelle einer Zeichenkette zu verwenden, so dass Sie eine Kompilierzeitprüfung erhalten:

Entity Framework .Include() mit Kompilierzeitprüfung?

0voto

Davut Gürbüz Punkte 5082

AFAIK, Für Silverlight (Domänendienste) reicht das Hinzufügen des Attributs [Include] an der richtigen Stelle (über der Navigationseigenschaft in den Metadaten) https://stackoverflow.com/a/5332188/413032

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