Entity Framework - навигация и включение свойств через коллекции - PullRequest
8 голосов
/ 23 сентября 2010

У меня только что был огромный * момент блондинки **, но он подчеркивает раздражение, которое я испытываю с Entity Framework. Я отключил отложенную загрузку, поэтому заставляю себя на самом деле думать о том, какие данные мне нужны, чтобы поддерживать приложение как можно быстрее.

Итак, чтобы вернуть данные в запросе, мне нужно использовать метод Include:

var query = from item in context.Customers
                .Include(x=> x.Orders)
            select item

Это нормально, пока я не хочу выбрать элемент немного глубже в иерархии. То есть:

Customer 1-* Orders *-1 Factory 1-1 Factory Type

Насколько я знаю, единственный способ вернуть все эти данные с нетерпением - это сделать следующее:

var query = from item in context.Customers
                .Include("Orders.Factory.FactoryType")
            select item

С учетом вышесказанного я не могу использовать System.Data.Entity лямбды в соответствии с моим первым примером. Кто-нибудь знает, если я упускаю что-то очевидное здесь, или я застрял с использованием строковых объявлений для моих свойств навигации по коллекциям?

Если бы у меня не было коллекций, я мог бы просто написать:

.Include(x=> x.Order.OrderType.Factory.FactoryType) // No bother

Но из-за коллекции Orders, насколько я могу судить, невозможно перейти к дочернему свойству (FirstOrDefault, SingleOrDefault и т. Д. Не работают).


** это всего лишь поворот фразы, мне очень нравятся блондинки *

1 Ответ

14 голосов
/ 24 сентября 2010

Для включения EntityCollections вы используете Выбор метод:

var query = from item in context.Customers
           .Include(c => c.Orders.Select(o => o.Factory.FactoryType))
           select item

Обратите внимание, что это не перегрузка стандартного ObjectQuery . Метод включения и является просто методом расширения для ObjectQuery Класс идет с EF CTP4 .

...