2010-01-13 34 views
0

基本上,模型是这样的:解决方案查询类别较少的类别树?

---------------------------------- 
| CAT_ID | CAT_NAME | CAT_PARENT | 
---------------------------------- 

使这个递归关系。但是,我们应该如何在我们的Asp.net mvc web应用程序中使用这个模型,并且查询量最少。我的临时解决方案是通过对象的功能,让函数传递对象,而不是requerry,但是这是我试过的代码:

public string CategoryTree(this HtmlHelper html, IEnumerable<Category> categories, int? parent) 
{ 
    parent = parent ?? 0; 
    string htmlOutput = string.Empty; 
    var cat = categories.Where(d => d.CAT_PARRENT == parent.Value); 
    if (cat.Count() > 0) 
    { 
     htmlOutput += "<ul>"; 
     foreach (Category category in cat) 
     { 
      htmlOutput += "<li>"; 
      htmlOutput += category.CAT_NAME; 
      htmlOutput += html.CategoryTree(categories, category.CAT_ID); 
      htmlOutput += "</li>"; 
     } 
     htmlOutput += "</ul>"; 
    } 

    return htmlOutput; 
} 

但这产生像4查询行4类。所以这不是解决这个问题的好办法。林使用LINQ到SQL。

回答

1

不要忘记.Count()也可以生成一个查询;你可以使用Where(),ToList()和它的.Count,因为无论如何你要使用完整的集合。

另一种方法是首先收集CAT_ID,获取所有相关子女的全部,然后将子女作为收集提示传递给您的方法。水木清华像

public string CategoryTree(this HtmlHelper html, IEnumerable<Category> categories, IList<Category> cats) 
{ 
     var query = categories.Where(x => false); 
     // a query to select ALL new children 
     foreach (var parent in cat.Select(x => x.CAT_ID)) 
      query = query.Union(categories.Where(x => x.CAT_PARENT = parent)); 
     var newchildren = query.ToList(); // execute query for all children at once - only once 

     foreach (Category category in cats) 
     { 
      htmlOutput += "<li>"; 
      htmlOutput += category.CAT_NAME; 
      // here we select only this category children - from already executed query results 
      htmlOutput += html.CategoryTree(categories, newchildren.Where(x => x.CAT_PARENT = category.CAT_ID).ToList()); 
      htmlOutput += "</li>"; 
     } 
} 

当然,这不是最终的代码,您最好使用IN [parentId的,parentId的,parentId的],而不是UNION的,但是这是想法。

+0

这是一个很大的帮助。难怪为什么我从我的代码中得到这么多的查询。 :P Thnaks一堆 – DucDigital 2010-01-13 12:36:34