2017-02-20 103 views
1

我的数据库由两个模型组成:产品和类别。 类别模型本身由父类和子类组成,就像一个特定的“ParentID”字段相互关联。 Parent to Children类别的关系是一对多关系。孩子可以是从零到'n'的任何数字。 与产品的关系类别(或子类别)是一对多关系,类别ID是产品表格中的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. 选定父类别(可选,没有选择返回所有类别)

我想去的地方检索所有产品:

CASE 'A':选择

  1. 产品的名称的父类中包含搜索串
  2. 所有类别包含搜索字符串

CASE“B”:选择

  1. 产品的名称中包含关于选定父类以及搜索字符串(只有那些产品 父类的 如果有的话)
  2. 选定的父类别名称包含搜索字符串
  3. 选择父类别的子类别(i F所列)名称中包含搜索字符串
+1

请问您可以添加定义'产品'和'类别'关系到您的问题的代码? 'Product'和'Category'之间是否有一对一的关系?听起来有点反直觉,一个'Category'只有一个'Product' ... – 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)),so:

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

目前没有关系,但父类别具有parentID空值,而子类别将其设置为其父类别标识,但我想我可以为此编写合适的方法。 – Luke

相关问题