2017-04-27 2 views
1

Ich bin auf der Suche nach einer Möglichkeit, komplexe Navigationseigenschaften zu spezifizieren, wenn eifrigen Laden Einheiten v6.1.3 Entity Framework mitWie kann ich eifrig laden eins: viele: eine Navigationseigenschaften in Entity Framework ohne magische Zeichenfolgen zu verwenden?

In meinem Szenario ein Customer viele SalesOrders hat und ein SalesOrder hat genau eine DeliveryAddress

die einschlägige Auszüge Einheit Code sind:

public class Customer {  
    public virtual ICollection<SalesOrder> SalesOrders { get; set; } 
} 

public class SalesOrder { 
    public Customer Customer { get;set; } 
    public Address DeliveryAddress { get; set; } 
} 

public class Address { 
    public virtual ICollection<SalesOrder> SalesOrders { get; set; } 
} 

ich muss nun ein Verfahren implementieren, die ein Kunde eifrig geladen werden kann, für die Aufträge alle ihre Aufträge und die Lieferadressen enthält.

Ich kann dies tun:

public class MyDbContext : DbContext { 

    public virtual DbSet<Customer> Customers { get; set; } 

    public Customer LoadCustomerIncludingSalesOrders(int customerId) { 
    var customer = Customers 
     .Include("SalesOrders") 
     .Include("SalesOrders.DeliveryAddress") 
     .FirstOrDefault(c => c.Id == customerId); 
    return customer; 
    } 

}

aber mit den Navigationseigenschaften spezifizieren mit magischen Saiten werden geladen wird, alle Arten von Kopfschmerzen verursachen mit Bits des Modells umbenennen.

Ich weiß, EF unterstützt auch die Angabe von Navigationseigenschaften mit einem Ausdruck, aber ich habe keine Ahnung, wie die Customer> SalesOrder> DeliveryAddress Zuordnung mit solchen Ausdrücken. Ist es möglich?

public Customer LoadCustomerIncludingSalesOrders(int customerId) { 
    var customer = Customers. 
    .Include(c => c.SalesOrders) 

    .Include(c => /* WHAT DO I PUT HERE? */) 

    .FirstOrDefault(c => c.Id == customerId); 
    return customer; 
} 
+1

Eine Möglichkeit, die String-Variante ein bisschen schöner zu machen wäre zu verwenden 'nameof'. – Mats391

+1

Wenn Sie in VS die Lambda-Überladung von 'Include' schwenken, sehen Sie ein ganzes Hilfethema, das beschreibt, wie Sie es für verschiedene Szenarien verwenden können, einschließlich Ihrer. Grundsätzlich müssen Sie 'Select's innen, z. 'Include (c => c.SalesOrder.Select (so => ​​.DeliveryAddress))' –

+0

@IvanStoev das ist absolut perfekt. Möchten Sie es als Antwort posten, damit ich es akzeptieren kann? Vielen Dank. –

Antwort

1

Als Ivan Stoev in seinem Kommentar weist darauf hin, die Syntax ich hier brauchen, ist:

public Customer LoadCustomerIncludingSalesOrders(int customerId) { 
var customer = Customers. 
    .Include(c => c.SalesOrders) 
    .Include(c => c.SalesOrders.Select(so => so.DeliveryAddress)) 
    .FirstOrDefault(c => c.Id == customerId); 
    return customer; 
} 
Verwandte Themen