проблема со свойствами навигации в рамках сущности - PullRequest
3 голосов
/ 31 марта 2011

Когда я выполняю этот запрос, я могу перемещаться в свойстве TypeP:

var items = from item in context.ProductosBodegas.Include("Product.TypeP")
            select item;

Но когда я выполняю этот запрос, свойство TypeP равно null:

var items = from item in context.ProductosBodegas.Include("Product.TypeP")
            select item.Product;

Почему это?

Ответы [ 3 ]

4 голосов
/ 31 марта 2011

Похоже, что «Включить» влияет только на непосредственно возвращаемый объект:

http://msdn.microsoft.com/en-us/library/bb896272.aspx

В противном случае вы можете позвонить

item.TypePReference.Load()

Но это может (и будет) приводить к проблемам производительности (выбор N + 1), если используется в цикле.

Другим вариантом будет «отменить» ваш запрос, предполагая, что отношения между Product и ProductosBodegas являются двунаправленными:

var items = context.Products
    .Include("TypeP")
    .Where(p => p.ProductosBodegas.Any( /* include condition here if needed */ ))
2 голосов
/ 31 марта 2011

Насколько я знаю, Entity Framework игнорирует Включает, как только вы не хотите возвращать полные объекты, а только проекции. Смотрите, например, ответ здесь . Я не уверен, что это все еще верно для всех типов прогнозов, но, очевидно, это все еще верно в вашей ситуации.

Вы можете обойти это, добавив свойство навигации, которое вы хотите загрузить в анонимный тип:

var items = from item in context.ProductosBodegas
            select new {
                Product = item.Product,
                TypeP = item.Product.TypeP
            };

(Вам больше не нужно .Include здесь.) После выполнения этого запроса (например, с помощью .ToList()) вы можете проецировать только ту часть анонимного типа, которую хотите иметь, например:

var products = items.ToList().Select(x => x.Product);

Элементы в этой коллекции products уже загрузили свойство ссылки TypeP.

Edit:

Важное примечание: не меняйте порядок .ToList и .Select.... Пока это ...

var products = items.Select(x => x.Product).ToList();

... также синтаксически корректен и также возвращает перечень продуктов, в этом случае ссылка TypeP НЕ будет загружена. Запрос для анонимного типа должен быть сначала выполнен в базе данных, а коллекция анонимных типов загружена в память. Затем вы можете выбросить ту часть анонимного типа, которую вы не хотите иметь, методом .Select.

1 голос
/ 01 ноября 2012

сначала загрузите товар

var items = from item in context.ProductosBodegas.Include("Product").Include("Product.TypeP")
            select item;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...