2010-11-22 17 views
0

Sagen wir, ich habe Tabellen Order und OrderLines. Ich benutze ef4 "include", um die OrderLines zu laden. Da die OrderLines als String referenziert wird, kann ich leider keine Eigenschaften davon anzeigen. Kurz gesagt, wenn OrderLines Eigenschaften Kosten und Größe hat, können diese referenziert werden? zum Beispiel so etwas wie diese, aber realisieren kann ich nicht:Stark typisierte gehören in Entität Rahmen 4

  orders= from Orders o in 
         db.Orders.Include("OrderLines") 
         where o.OrderId == this.OrderId 
         select new() 
        { 
        o.cost 
        o.size 
        } 

Wenn nicht, wie würde ich dies acheive?

Dank

Stu

Antwort

1

Es hängt davon ab, ob Sie Filter wollen die Ergebnismenge auf der Grundlage der OrderLines oder einfach darauf zugreifen aus der Ergebnismenge .

sagen, wenn Sie eine Liste der Orders (mit OrderLines enthalten) wollte, wo die OrderLines Kosten mindestens 10,00 $ und einer Größe von 5. Sie dies tun könnte:

var orders = ctx 
       .Orders 
       .Include("OrderLines") 
       .Where(x => x.OrderLines.Any(y => y.Cost >= 10.00 && y.Size == 5)) 
       .ToList(); // result is List<Orders> with OrderLines populated. 

Wenn Sie nur wollen, dass die OrderLines, dann Projekt die Auftragszeilen:

var orders = ctx 
       .Orders 
       .Include("OrderLines") 
       .Where(x => x.OrderLines.Any(y => y.Cost >= 10.00 && y.Size == 5)) 
       .Select(x => x.OrderLines) 
       .ToList(); // result is List<OrderLine> 

Ihre Projektion wurde eine Liste von anonymen Typen Rückkehr w i mit zwei Eigenschaften. Sie müssen das stark typisierte Objekt, wie diese zurückziehen:

var orders = ctx 
       .Orders 
       .Include("OrderLines") 
       .ToList(); // result is List<Orders> with OrderLines populated 

Nun wird OrderLines als ICollection<T> auf jede Ordnung ausgesetzt werden.

Z. B

foreach (var order in orders) 
{ 
    Console.Write("Order Id: " + order.OrderId); 
    foreach (var orderLine in order.OrderLines) 
    { 
     Console.Write("Order Line: " + orderLine.OrderLineId); 
     Console.Write("Order Line Cost: " + orderLine.Cost); 
    } 
} 
+0

Gründlich beantwortet meine Frage. Vielen Dank. Stu – hoakey

+0

Ich bin froh zu helfen. :) – RPM1984

0

Die Include-Methode auf einem Objekt wie Orders setzen wird die Orderlines Instanzen bei jeder Bestellung Instanz zugeordnet zu „eager-load“, dass die Daten so, dass zur gleichen Zeit abgerufen wird und speichern Sie einen Ausflug in die DB.

Für jede abgerufene OrderLine-Instanz werden alle Skalareigenschaften automatisch abgerufen. Ja, Kosten und Größe (von denen ich annehme, dass es Skalare sind) werden abgerufen. Wenn OrderLine nun über eine andere Navigationseigenschaft verfügt (eine andere Entität, auf die in OrderLine als Eigenschaft verwiesen wird), wie z. B. OrderLine.Product, die aus der Products-Tabelle stammt, wird sie nicht abgerufen. Wenn Sie wollen auch eifrig Last, die Eigentum von Orderline, könnten Sie wie folgt vorgehen:

from Orders o in db.Orders 
        .Include("OrderLines") 
        .Include("OrderLines.Product") 
        where o.OrderId == this.OrderId 
        select new() 
       { 
       o.cost 
       o.size 
       } 
+1

Eigentlich müssen Sie nur die letzte einschließen, wie laden Fügen Sie den gesamten Pfad –

+0

Hallo James. Wenn ich versuche, die OrderLines-Requisiten auf diese Weise zu entlarven, erscheinen sie nicht. Nur die Auftragsrequisiten sind ausgesetzt. Die Kosten und die Größe sind Scaler Requisiten von OrderLines. – hoakey

+0

Mikael, guter Punkt –