如何在嵌套的LINQ提供的集合中对项目进行排序

时间:2010-05-21 01:33:10

标签: c# linq linq-to-sql

我有一个名为Category的(SQL Server)数据库表。 另一个名为SubCategory的数据库表。

SubCategory与Category具有外键关系。因此,感谢LINQ,每个Cateogory都有一个名为SubCategories的属性,当我抓住它时,LINQ足以返回与我的类别相关联的所有子类别。

如果我想按字母顺序对 Categories 进行排序,我可以这样做:

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

但是,我不知道如何在每个类别中订购 SubCategories 集合。

我的目标是返回一个类别集合,其中的所有SubCategory集合都按名称按字母顺序排序。

4 个答案:

答案 0 :(得分:2)

在这种情况下,我更喜欢使用扩展方法 - 因为它们可以很好地封装这个逻辑以便重用 - 而一个好的名称也可以帮助使逻辑易于发现。

例如,在我在MVC应用程序中使用L2S的项目中,我只是在我的Models文件夹中创建一个名为Extensions的文件夹 - 然后我在每个模型/ L2S类/ etc中删除'扩展'方法(只是为了保持事情有组织)。

然后,对于这种情况,我会创建类似的东西:

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的例子 - 但你可以在任何地方应用它,因为你的想法就是用一种明确做你所追求的方法“装饰”你的对象,而你却没有制作额外的副本/等等。

答案 1 :(得分:0)

您需要在类别上使用Group By,然后按子类别排序。

答案 2 :(得分:0)

您可以通过将linq对象转换为列表来实现。

e.g。

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属性转换为列表将为您提供内联排序方法。

答案 3 :(得分:0)

这可能是很多方法之一:

在dbml设计器中,选择CategorySubcategory之间的关联(虚线)。

打开属性窗格,然后展开“子属性”。

将名称从SubCategories更改为_subCategories,将访问权限从Public更改为Internal

单击设计图面并按F7,或右键单击并选择“查看代码”。

添加此属性:

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

现在您拥有相同的属性SubCategories,这是真正有序的。