解决方案查询类别较少的类别树?
问题描述:
基本上,模型是这样的:解决方案查询类别较少的类别树?
----------------------------------
| 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。
答
不要忘记.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的,但是这是想法。
这是一个很大的帮助。难怪为什么我从我的代码中得到这么多的查询。 :P Thnaks一堆 – DucDigital 2010-01-13 12:36:34