我的数据库由两个型号组成:产品和类别。 类别模型本身由父类别和子类别组成,与特定的“父母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,添加所需的结果,我应该如何在子类别名称中循环?
添加模型(仅限相关字段):
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; }
}
试图更好地解释它。给出:
我想检索所有产品:
CASE'A':未选择父类别
CASE'B':选择了父类别
答案 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)));