Это ответ на другой вопрос, который я опубликовал несколько дней назад, на который был успешно дан ответ, но он действительно не затрагивал основную проблему, с которой я столкнулся, но не смог выразить полностью в моем исходном запросе.
У меня есть таблица 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, и тогда я не получаю другие заполненные свойства / потомки бесплатно.