2010-11-22 3 views
0

Disons que j'ai des tables Order et OrderLines. J'utilise ef4 "include" pour charger les lignes de commande. Malheureusement, étant donné que la ligne de commande est référencée en tant que chaîne, je ne suis pas en mesure d'exposer ses propriétés. Bref, si OrderLines a le coût et la taille des propriétés, peut-on les référencer? par exemple quelque chose comme ceci, mais se rendent compte que je ne peux pas:Inclus fortement dans include framework 4

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

Si non, comment j'achèterais ceci?

Merci

Stu

Répondre

1

Cela dépend si vous voulez filtre le jeu de résultats sur la base du OrderLines ou accéder simplement à partir du jeu de résultats .

Say si vous voulez une liste de Orders (avec OrderLines inclus), où le coût OrderLines au moins 10,00 $ et une taille de 5. Vous pouvez le faire:

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. 

Si vous ne veulent que le OrderLines, puis projet les lignes de commande:

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> 

Votre projection retournait une liste des types anonymes, w avec deux propriétés. Vous devez retirer l'objet fortement typé, comme ceci:

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

Maintenant, OrderLines sera exposé comme ICollection<T> sur chaque commande.

par exemple

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

Répond complètement à ma question. Merci beaucoup. Stu – hoakey

+0

Content de vous aider. :) – RPM1984

0

La Inclure méthode sur un objet fixé comme commandes va « désireux charge » que les données de telle sorte que les instances OrderLines associés à chaque instance de commande est tiré par les cheveux en même temps et vous sauver un voyage à la DB.

Chaque instance de OrderLine récupérée aura toutes ses propriétés scalaires automatiquement récupérées alors oui, le coût et la taille (que je suppose être des scalaires) seront récupérés. Maintenant, si OrderLine a une autre propriété de navigation (une autre entité référencée comme une propriété sur OrderLine) comme OrderLine.Product qui provient de la table Products, alors elle ne sera pas récupérée. Si vous voulez également désireux de charge que la propriété de OrderLine, vous pouvez effectuer les opérations suivantes:

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

En fait, il vous suffit de la dernière Déclarez comme Inclure chargera tout le chemin –

+0

Salut James. lorsque j'essaie d'exposer les accessoires OrderLines de cette manière, ils n'apparaîtront pas. Seuls les accessoires de l'Ordre sont exposés. Le coût et la taille sont les accessoires d'échelle de OrderLines. – hoakey

+0

Mikael, bon point –