Хорошо, если все ассоциации были правильно настроены из вашей базы данных, то это будет один простой запрос:
var product = from p in context.Products
select new {
Name = product.ProductName,
CategoryNames = p.ProductCategories
.Select(c => c.CategoryName).ToList(),
ParentCategories = p.ProductCategories
.Select(c => c.ProductCategory2.CategoryName).ToList()
};
Когда EF отображает Само-ссылающиеся ассоциации , этосоздает два соответствующих свойства навигации с именами ProductCategory1
и ProductCategory2
.Ни одно из этих имен не особенно полезно, одно из этих свойств навигации относится к родительской категории или стороне 0..1 отношения.Другой относится к детям или * стороне отношений.
Чтобы понять, что есть что, щелкните правой кнопкой мыши ProductCategory1 в окне свойств, кратность для ProductCategory1 равна * (много), поэтому ProductCategory1 представляетсвойство навигации для дочерних элементов или подкатегорий (также оно имеет тип EntityCollection<ProductCategory>
), а другое - ProductCategory2 - представляет родительскую категорию для этой категории и имеет тип ProductCategory
.По вашему запросу мы заинтересованы в этом.
Кроме того, чтобы сделать ваш запрос более читабельным, можно переименовать ProductCategory1 в Подкатегории и ProductCategory2 в ParentCategory .