当前位置: 首页 > 知识库问答 >
问题:

c# / linq 中的类别和子类别

谭俊
2023-03-14

我正在使用产品的ms-sql db构建一个 asp.net 网站 - 每个产品属于一个或多个类别,每个类别可以属于一个或零个父类别。

用户应该能够选择零个或多个类别,但我想不出一种方法来只返回所选类别中的产品。

我有其他正在工作的过滤器(最低价格,品牌名称等),但不能让类别工作。

例如:

-Category 1
|---Sub-Category 1.1
    |---Sub-Sub-Category 1.1.1
    |---Sub-Sub-Category 1.1.2

|---Sub-Category 1.2

|---Sub-Category 1.3

如果选择了类别1,则应返回具有最终父类别为类别1的类别的所有产品。

如果选择了子类别1.1和子类别1.2,则所有具有最终父类别1.1或子类别1.2的类别的产品都应返回。

这是我的代码:

产品:

public class Product
{
    [Key]
    public int ProductID { get; set; }
    public string Description {get;set;}
    public double Price {get;set;}

    public virtual List<Category> Categories { get; set; }

    public Product()
    {
       Categories = new List<Category>();
    }

}

类别:

public class Category
{
    [Key]
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }

    public int? ParentCategoryID { get; set; }

    [JsonIgnore]
    public Category Parent { get; set; }

    [JsonIgnore]
    public virtual List<Product> Products { get; set; }

}

简化的WebApi控制器:

public object Get(  [FromUri] string[] categories)
{
    List<Product> search_results = (from p in db.Products  
        where 1==1
              && p.Price >= minPrice && p.Price <=maxPrice 
             // only return products in selected categories

      select p).ToList();

}

共有1个答案

吕亮
2023-03-14

如果您对子类别没有限制,您可以使用递归:

public object Get(  [FromUri] string[] categories)
{
    var categories = db.Categories.Where(c => categoriesIds.Contains(c.Id));
    Func<Product, bool> filters = p => 1==1
          && p.Price >= minPrice && p.Price <=maxPrice 
    return GetCategoryiesProducts(categories, filters)
}

public IList<Product> GetCategoryiesProducts(IList<Category> categories, Func<Product, bool> filters)
{
    var result = new List<Product>();
    foreach (var c in categories) 
    {
        result.AddRange(c.Products.Where(filters).ToList());
        var subCategories = db.Categories.Where(s => s.ParentCategoryID != null && (int)s.ParentCategoryID == c.Id))
        if (subCategories != null && subCategories.Count > 0)
        {
             result.AddRange(GetCategoryiesProducts(subCategories, filters))
        }
    }
    List<Product> search_results result;
}

但如果有很多类别,这将是一个昂贵的解决方案。为了优化效率,您可以向每个父类别添加产品以消除递归:

List<Product> search_results = (from p in db.Products  
where 1==1
    && p.Price >= minPrice && p.Price <=maxPrice 
    && p.Categories.Any(c => categoriesIds.Contains(c.Id))
select p).ToList();  
 类似资料:
  • 我目前有一个代码片段,其中对于每个类别,它将找到子类别: 将递归获取一个类别的子级: 目前,使用,只检索子类别的子类别,因此如果每个子类别都有自己的子类别,则不会将其保存到子类别中。 我如何显示子子类别给我们的子类别? 我想用我的代码做的是获取一个父级,获取它的子级,然后将这些子级中的每一个视为父级,递归地获取它的子级,但是我的JSON输出并没有反映这一点。只有父对象有子对象-子对象没有子对象(尽

  • 我已经为产品创建了一些自定义类别,它有子类别,子类别还有更多的子类别。现在我首先显示主要类别。如果我在那里显示子类别,那么将显示与该类别及其子类别相关的所有子类别。我想一步一步地向他们展示。也就是说,如果用户单击主类别,则会转到其子类别页面。如果用户单击其子类别之一,则应转到子类别,如果没有子类别,则显示产品。这是什么代码 它覆盖了以前的排序顺序。也就是说,如果从仪表板中,我们按排序顺序给出2到3

  • 我的类别表设计如下 我有三个级别的类别 < li >父项 < li >孩子 < li >子系 如何以下列方式显示它们? (SELECT*From类别):我得到以下数组,如下所示

  • 我正试图通过WoodPress主题中的一个函数从woocommerce获取产品类别,我已经做到了: 这将按层次列出所有顶级类别及其下的子类别,但我有子类别(子类别)的子类别,因此如何列出这些子类别。

  • 我试图在html表中输出类别和子类别,我有一个问题,即所有的子类别都打印在所有的类别下 我用这个公式 cat_id 猫名 母猫 我想打印父主类别下的每个子类别 我使用这个代码 还有显示器。第三方物流是 有什么想法吗,伙计们 问候

  • 我想有类别和子类别,所以我创建了一个表 类别:id、名称、页面id、家长id 这是我的应用程序/模型/Categories.php模型 这是我的应用程序/模型/Pages.php模型 然后在我的控制器中,我调用模型 这是可行的,但问题是返回了所有类别,我只想要那些具有parent\u id=0(如果parent\u id 我还想知道如何生成类别和子类别的数组,这样我也可以返回这些信息