2017-02-20 14 views
1

Моя база данных состоит из двух моделей: Продукты и категории. Сама модель категории состоит из категорий родителей и детей, как для определенного поля «ParentID», связанного с другими. Отношение Родитель к категории детей - одно для многих. Дети могут быть любым числом от нуля до «n». Категория отношения (или подкатегория) к Продуктам является одной для многих, а CategoryID - таблицей FK в продуктах.Поиск строки внутри продуктов, категорий и подкатегорий

Я начал писать поиск среди названия и описания и категория Имя продуктов:

IQueryable<Product> products = 
      from p in db.Products 
      where (p.Name.Contains(searchString) 
       || p.Description.Contains(searchString) 
       || p.Category.Name.Contains(searchString)) 
       select p; 

Поскольку форма позволяет пользователю выбрать определенную категорию из DDL, в случае, если была выбрана категория Мне нужно Теперь, чтобы расширить свой запрос подкатегорий следующим образом:

  1. ищет строку поиска в имя детей категорий слишком

  2. результатов фильтрации для тех, кто принадлежит к категории и подкатегории только

  3. добавления новых элементов предыдущего результата

Как я должен циклу внутри дочерних категории имени, чтобы выполнить Баллы 1.2.3, добавление Необходимый результат для ранее выбранного?

Добавление модели (только соответствующие поля):

public partial class Product 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public int CategoryID { get; set; } 
} 

public partial class Category 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int? ParentID { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

Пытаясь лучше объяснить.Дано:

  1. Строка поиска (нет строки поиска возвращает все продукты)
  2. выбранной родительской категории (по желанию, выбор не возвращает все категории)

Я хочу, чтобы извлечь все продукты, где:

СЛУЧАЙ 'A': нет родительской категории выбрана именем

  1. продуктов содержит поиск Строка
  2. все категории содержит строки поиска

ДЕЛУ «B»: Родительская категорию выбранного имени

  1. продуктов содержит строку поиска (только те продукты , относящееся к выбранной родительской категории и ее категории детей, , если таковые имеются)
  2. имя выбранной родительской категории содержит строку поиска
  3. отдельные категории детей родителя (i е любое) имя содержит строку поиска
+1

Не могли бы вы добавить код, определяющий отношения 'Product' и' Category' на ваш вопрос? У вас действительно есть отношение «один к одному» между «Продуктом» и «Категорией»? Звучит немного интуитивно понятным для «Категории» только для одного «продукта» ... – wkl

+1

Вы действительно правы. Я отредактировал отношение, это много продуктов для категории. – Luke

ответ

0
IQueryable<Product> products = 
     from p in db.Products 
     where (p.Name.Contains(searchString) 
      || p.Description.Contains(searchString) 
      || p.Category.Name.Contains(searchString)) 
      select p; 

if (selectedCategoryID.HasValue) // filter category AND subcategories 
     { 
      List<int> categories = new List<int>(); 
      categories.Add(selectedCategoryID.Value); 
      foreach(Category child in GetCategories.activeChildrenCategories(db,selectedCategoryID.Value)) 
      { 
       categories.Add(child.ID); 
      } 

      products = products .Where(p => (categories.Contains(p.Category.ID))); 
+0

Работа в соответствии с запросом. – Luke

0

Если предположить, что дочерние категории подвергаются как перечислимы на родительской категории и, вероятно, под названием Категория, то исходный запрос может быть расширен для поиска на них с помощью оператора Any(), например, p.Category.Categories.Any(x => x.Name.Contains(searchString)), так:

var products = 
    from p in Products 
    where (p.Name.Contains(searchString) 
     || p.Description.Contains(searchString) 
     || p.Category.Name.Contains(searchString) 
     || p.Category.Categories.Any(x => x.Name.Contains(searchString)) 
    ) && p.IsDeleted == false && p.IsApproved == true 
    select p; 

Ваш фильтр на родительской категории могут продолжать использоваться как есть.

+0

Это наоборот: поскольку отношение является множеством продуктов для одной категории, это модель категории, которая подвергает IEnumerable продуктов. Не так ли? – Luke

+0

Я принимал отношение родственных категорий к дочерним (дочерним) категориям. – stovroz

+0

В настоящее время нет никакого отношения, но родительские категории имеют значение null родительского идентификатора, в то время как для категорий детей он установлен в их родительский идентификатор категории, но я полагаю, что могу написать подходящий метод для этого. – Luke