0

Web ページで製品カテゴリの再帰的なカテゴリ メニューを作成したいです。各カテゴリは、「製品」テーブルの CategoryId に従って関連する最初の項目を取得する必要がありますが、カテゴリに製品がない場合、このカテゴリは消えるはずです。非再帰的なカテゴリ メニューに INNER JOIN を使用すると簡単に解決できます。この問題を解決するにはどうすればよいですか?

私は次のような方法を使用できますが、この方法はアマチュアであり、最初のアイテムがnullになる可能性があります。

カテゴリー表

+--------------+---------------+------------+
|  CategoryId  | CategoryName  | ParentId   |
+--------------+---------------+------------+
|      1       | Cookware      |   NULL     |
+--------------+---------------+------------+
|      2       | Tableware     |   NULL     |
+--------------+---------------+------------+
|      3       | Teapots       |     1      |
+--------------+---------------+------------+
|      4       | Cutleries     |     3      |
+--------------+---------------+------------+
|      5       | 30pcs Cutlery |     2      |
+--------------+---------------+------------+

製品表

+--------------+--------------+--------------------+------------+
|  ProductId   | ProductCode  | ProductName        | CategoryId |
+--------------+--------------+--------------------+------------+
|       1      |   G110090    |   Teapot           |      3     |
+--------------+--------------+--------------------+------------+
|       2      |   D220623    |   Cutlery Set      |      5     |
+--------------+--------------+--------------------+------------+ 

RecursiveCategory メソッド

public string RecursiveCategory(IEnumerable<Category> category, int? parent)
{
    string catNode = string.Empty;
    if(category.Any(n=>n.ParentId == parent))
    {
        catNode += "<ul>";
            foreach(Category c in category)
            {
                catNode += "<li>";
                catNode += "<a href='/Detail/" + GetFirstItem(c.CategoryId).ProductId + "'>"+c.CategoryName+"</a>";
                catNode += RecursiveCategory(category, c.ParentId);
                catNode += "</li>";
            }
        catNode += "</ul>"
    }
    return catNode;
}

GetFirstItem メソッド

public Product GetFirstItem(int categoryId)
{
    Product prod = new Product();
    foreach(Product p in db.Product.Where(n=>n.CategoryId == categoryId))
    {
        prod.ProductId = p.ProductId;
        prod.ProductName = p.ProductName;
        ...
    }
    return prod;
}
4

1 に答える 1

0

これを試して、特定のポイントから階層を構築してください (最初の呼び出しで null を使用すると、各カテゴリの製品を含む完全なツリーが得られます)。変更として、必要に応じて製品を遅延ロードすることができます。

public class Category
{
  IEnumerable<Category> Children {get;set;}
  IEnumerable<Product> Products {get;set;}
}

public IEnumerable<Category> GetCategory(int? parent)
{
  var result = new List<Category>();
  foreach (var cat in categories.Where(p => p.parentId = parent)
  {
     var generatedCategory = new Category();
     generatedCategory.Children = GetCategory(cat.id);
     generatedCategory.Products = products.Where(p => p.CategoryId = cat.CategoryId);
     result.Add(generatedCategory);
  }
  return result;
}

注:コードを簡単に作成する方法についてのガイドとして、コードをテストしていません。

于 2013-11-06T12:07:24.133 に答える