我有一个名为Category的(SQL Server)数据库表。 另一个名为SubCategory的数据库表。
SubCategory与Category具有外键关系。因此,感谢LINQ,每个Cateogory都有一个名为SubCategories的属性,当我抓住它时,LINQ足以返回与我的类别相关联的所有子类别。
如果我想按字母顺序对 Categories 进行排序,我可以这样做:
return db.Categories.OrderBy(c => c.Name);
但是,我不知道如何在每个类别中订购 SubCategories 集合。
我的目标是返回一个类别集合,其中的所有SubCategory集合都按名称按字母顺序排序。
答案 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设计器中,选择Category
和Subcategory
之间的关联(虚线)。
打开属性窗格,然后展开“子属性”。
将名称从SubCategories
更改为_subCategories
,将访问权限从Public
更改为Internal
。
单击设计图面并按F7,或右键单击并选择“查看代码”。
添加此属性:
public partial class Category
{
public IOrderedEnumerable<SubCategory> SubCategories
{
get { return _subCategories.OrderBy(s => s.Name); }
}
}
现在您拥有相同的属性SubCategories
,这是真正有序的。