在产品,类别和子类别中搜索字符串

时间:2017-02-20 09:21:50

标签: c# linq

我的数据库由两个型号组成:产品和类别。 类别模型本身由父类别和子类别组成,与特定的“父母ID”字段相关,其中一个与其他字段相关。 Parent to Children类别的关系是一对多。儿童可以是从零到'n'的任何数字。 Products的关系Category(或SubCategory)是一对多,CategoryID是Products表中的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. 将新项目添加到上一个结果

  4. 为了实现点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. 选定的父类别(可选,无选择返回所有类别)
    3. 我想检索所有产品:

      CASE'A':未选择父类别

      1. 产品名称包含搜索字符串
      2. 所有类别都包含搜索字符串
      3. CASE'B':选择了父类别

        1. 产品名称包含搜索字符串(仅限那些产品 属于选定的父类别及其子类别, 如果有的话)
        2. 选定的父类别名称包含搜索字符串
        3. 所选父项的子类别(如果有)名称包含搜索字符串

2 个答案:

答案 0 :(得分: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;

您可以继续按原样使用父类别的过滤器。

答案 1 :(得分: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)));