Стремление загружать и проецировать в Linq для объектов - PullRequest
0 голосов
/ 27 июля 2010

Это ответ на другой вопрос, который я опубликовал несколько дней назад, на который был успешно дан ответ, но он действительно не затрагивал основную проблему, с которой я столкнулся, но не смог выразить полностью в моем исходном запросе.

У меня есть таблица Product. Продукт связан с ProductDescription в отношениях один ко многим. ProductDescription может иметь более одной строки для каждого продукта. Он будет иметь несколько строк, если есть несколько переводов для описания продукта. Продукт имеет много-к-одному отношения с языком. Язык имеет код языка (en, es и т. Д.), А также LanguageId (также можно найти в ProductDescription).

Я хочу предоставить своим пользователям возможность запрашивать продукт, а также указать приложению, чтобы оно возвращало описания этого продукта только на определенном языке.

Проблема, с которой я столкнулся, заключается в том, что я понимаю, что мне нужно использовать проекцию, чтобы выполнить задачу в 3-м абзаце этого вопроса. Примерно так:

    var query = inventoryRepository.Products
                        .Where(wherePredicate)
                        .Select( a=> new Product
                        {
                            ProductDescriptions = inventoryRepository.ObjectContext.ProductDescriptions
                               .Where(a => a.Languages.AlternateCode.Equals("en", StringComparison.CurrentCultureIgnoreCase))
                        });

Однако у меня есть около 15 свойств в таблице «Продукты», а также еще 4 дочерних таблицы «Продукты», которые необходимо загрузить для набора результатов в дополнение к языковой части. Могу ли я как-нибудь выполнить загрузку и проекцию, чтобы мне не приходилось вручную просматривать все эти свойства и дочерние объекты? Вот где мой код стоит прямо сейчас:

var query = inventoryRepository.ObjectSet
                    .Include("ProductDescriptions")
                    .Include("ProductAllowedWarehouses")
                    .Include("ProductToCategories")
                    .Include("PriceLevels")
                    .Include("AttachmentAssociations.Attachment").AsExpandable()
                    .Where(wherePredicate);

Нет Выберите нужное, что действительно приятно. Как только я изменяю ProductDescription на проекцию, я добавляю Select, и тогда я не получаю другие заполненные свойства / потомки бесплатно.

1 Ответ

1 голос
/ 27 июля 2010

Я бы прочитал этот блог о прогнозах + нетерпеливая загрузка.Вы столкнетесь с проблемами, когда дело доходит до энергичной загрузки.Рекомендуется использовать .Any и выполнить дополнительный выбор.

Почему вы не можете просто добавить фильтр / где в ProductDescription?

 var query = inventoryRepository.ObjectSet
                .Include("ProductDescriptions")
                .Include("ProductAllowedWarehouses")
                .Include("ProductToCategories")
                .Include("PriceLevels")
                .Include("AttachmentAssociations.Attachment").AsExpandable()
                .Where(wherePredicate)
                .Where(a=>a.ProductDescriptions.Languages.AlternateCode.Equals("en", StringComparison.CurrentCultureIgnoreCase);
...