2013-02-25 4 views
2

Ниже приведен класс POCO, который я создал с помощью кода Entity Framework. Как я могу запросить мою базу данных, чтобы я мог вернуть все бренды определенной категории?Как правильно использовать свойства навигации EF?

Пример: У вас есть список категорий, и вы нажмете на него. Он показывает все марки продуктов, доступных в этой категории.

Я не знаю, правильно ли настроены мои классы для этого.

public class Product 
    { 
     [Key,ScaffoldColumn(false)] 
     public int ProductID { get; set; } 


     public string ProductName { get; set; } 

     public int? CategoryID { get; set; } 

     public virtual Category Category { get; set; } 


     public int? BrandID { get; set; } 

     public virtual Brand Brand { get; set; } 


    } 


    public class Brand 
    { 

     [ScaffoldColumn(false)] 
     public int BrandID { get; set; } 


     public string BrandName { get; set; } 

    } 


    public class Category 
    { 
     [ScaffoldColumn(false)] 
     public int CategoryID { get; set; } 

     public string CategoryName { get; set; } 

     public virtual ICollection<Product> Products { get; set; } 

} 
+0

Почему бы вам не создать связь между «Брэнд» и «Категория», если вам понадобится такая информация, как все марки для категории. Говоря так, я думаю, вам нужны либо отношения «1: N», либо «M: N» b/w эти две таблицы/сущности? – Leron

+0

Я думал об этом, но я бы не думал, что бренд будет иметь отношение к категории, но более того, к продукту. Продукт будет иметь отношение как к категории, так и к бренду. Наверное, я смотрю, как правильно это сделать. – jackncoke

+0

Я бы предпочел отношение внешнего ключа, даже если вам понадобится только этот запрос. В противном случае вы должны использовать 'JOIN' и/или' UNION' с 'LINQ', который я попытаюсь сбежать. Сценарий внешнего ключа проще, и я считаю, что это лучший способ справиться с этим. – Leron

ответ

2

насчет

context.Products. 
    Where(p => p.Category.CategoryID == categoryToFind).Select(p => p.Brand); 

или

var brands = context.Products. 
    Where(p => p.Category.CategoryID == categoryToFind). 
    Select(p => p.Brand.BrandName).Distinct().ToList(); 

если вам просто нужно брендам.

+0

Какой тип метода вы могли бы обернуть, если бы вы только хотели вернуть 'Brandnames' обратно на страницу? IQueryable или List? – jackncoke

+1

@jackncoke Вероятно, метод возвращает список имен Distinct(). Если не так много данных, возможно, даже вытащить все клиентскую сторону и фильтровать локально. –

+0

Обновленный ответ. – Phil

Смежные вопросы