2010-01-13 61 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