Сильно типизированное включение в сущность 4 - PullRequest
0 голосов
/ 22 ноября 2010

Допустим, у меня есть таблицы Order и OrderLines.Я использую ef4 "include" для загрузки OrderLines.К сожалению, поскольку OrderLines упоминается как строка, я не могу раскрыть ни одно из его свойств.Короче говоря, если у OrderLines есть свойства cost и size, можно ли на них ссылаться?например, что-то вроде этого, но понимаю, что я не могу:

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

Если нет, как бы я это достиг?

Спасибо

Stu

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Зависит от того, хотите ли вы фильтровать набор результатов на основе OrderLines или просто получить к нему доступ из набора результатов.

Скажите, хотите ли вы список Orders(включая OrderLines), где OrderLines стоит не менее 10,00 долларов США и размером 5. Вы можете сделать это:

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.

Если вы только хотите OrderLines, затем проект строки заказа:

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>

Ваша проекция возвращала список анонимных типов с двумя свойствами.Вам необходимо отодвинуть объект со строгим шрифтом, например:

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

Теперь OrderLines будет отображаться как ICollection<T> на каждый ордер.

Например

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 голосов
/ 22 ноября 2010

Метод Include для набора объектов, такого как Orders, собирается «загружать» эти данные таким образом, чтобы экземпляры OrderLines, связанные с каждым экземпляром Order, выбирались одновременно и сохраняли вашу поездку в БД.

Каждый извлеченный экземпляр OrderLine будет автоматически получать все свои скалярные свойства, поэтому да, стоимость и размер (которые я предполагаю, являются скалярами) будут получены.Теперь, если у OrderLine есть другое свойство навигации (другая сущность, на которую ссылаются как свойства в OrderLine), например, скажем, OrderLine.Product, которая находится в таблице Products, тогда она не будет получена.Если вы также хотите загрузить это свойство OrderLine, вы можете сделать следующее:

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