2010-05-21 28 views
4

我有一個名爲Category的(SQL Server)數據庫表。 另一個名爲SubCategory的數據庫表。如何訂購嵌套的LINQ提供的集合中的項目

子類別與類別具有外鍵關係。正因爲如此,得益於LINQ,每個Cateogory都有一個名爲SubCategories的屬性,當我抓取它時,LINQ足以返回與我的類別相關的所有SubCategories。

如果我想將分類按字母順序排序,我可以這樣做:

return db.Categories.OrderBy(c => c.Name); 

但是,我不知道如何訂購的每個類別內的子類別收集

我的目標是返回一個Categories的集合,其中的所有SubCategory集合都按名稱按字母順序排列。

回答

2

在這種情況下,我更喜歡使用擴展方法 - 因爲他們在封裝這個邏輯以便重用方面做得很好 - 而且一個好的名字也可以使邏輯易於被發現。

例如,在MVC應用程序中使用L2S的項目中,我只在我的Models文件夾中創建了一個名爲Extensions的文件夾 - 然後在每個模型/ L2S類/ etc中放置'extension'方法保持組織有序)。

然後,這種情況下我會創造一些東西,像這樣:

public static class CategoryExtensions 
{ 

    public static List<SubCategory> GetAlphabetizedSubCategories(this Category category) 
    { 
    return category.SubCategories 
     .OrderBy(sc => sc.Name) 
     .ToList(); 
    } 
} 

,然後從我的MVC視圖中,例如,如果我在類別正經過的型號,我可以只是做一樣簡單的東西:

<% foreach(SubCategory subCat in Model.GetAlphabetizedSubCategories()) { %> 
    <p>Stuff goes here... </p> 
<% } %> 

這是一個MVC例子 - 但是你可以申請那個漂亮,很多地方一樣的想法是,你「裝飾」的對象與方法,明確做什麼你」之後,並且你沒有製作額外的拷貝/等等。

+0

這很好,而且非常合適,因爲我確實需要重用它。 – 2010-05-21 15:47:24

0

您需要在類別上使用Group By,然後按子類別排序。

0

你可以通過將linq對象轉換爲列表來實現。

例如

var categoryList = db.Categories 
    .OrderBy(c=> c.Name) 
    .ToList(); 
categoryList.ForEach(c => c.SubCategory.ToList().Sort((x, y) => x.Name.CompareTo(y.Name))); 
return categoryList; 

將類別列入列表使您可以使用Linq ForEach擴展方法。 將SubCategory屬性轉換爲列表可爲您提供內嵌排序方法。

0

下面是可能還有很多這樣做的方法之一:

在您的DBML設計師,選擇CategorySubcategory之間的關聯(虛線)。

打開屬性窗格,並展開「子屬性」。

將名稱從SubCategories更改爲_subCategories,將Public更改爲Internal

單擊設計圖面並按F7,或者右鍵單擊並選擇「查看代碼」。

添加此屬性:

public partial class Category 
{ 
    public IOrderedEnumerable<SubCategory> SubCategories 
    { 
     get { return _subCategories.OrderBy(s => s.Name); } 
    } 
} 

現在你有相同的屬性,SubCategories,這是真正有序。