C# 查询中的Linq排序子级

C# 查询中的Linq排序子级,c#,linq,entity-framework,asp.net-mvc-3,razor,C#,Linq,Entity Framework,Asp.net Mvc 3,Razor,我有一个EF模型,如下所示: 在这个模型上,我显然可以使用Categories.Products来接收产品列表 我有一个查询,返回类别列表,其中产品作为要在ASP.NET MVC 3视图中使用的列表: var categories = (from a in context.Categories.Include("Products") orderby a.SortOrder ascending select a).ToLis

我有一个EF模型,如下所示:

在这个模型上,我显然可以使用
Categories.Products
来接收产品列表

我有一个查询,返回类别列表,其中产品作为要在ASP.NET MVC 3视图中使用的列表:

var categories = (from a in context.Categories.Include("Products")
                  orderby a.SortOrder ascending
                  select a).ToList();
return View(categories);
为了按产品分类顺序展示产品,我目前必须:

<ul>
@foreach (var category in Model)
{
    <li>@category.Title
        <ul>
        @foreach (var product in category.Products.OrderBy(a => a.SortOrder))
        {
            <li>@product.Description</li>
        }
        </ul>
    </li>
}
</ul>
    @foreach(模型中的var类别) {
  • @类别.名称
      @foreach(category.Products.OrderBy(a=>a.SortOrder)中的var产品) {
    • @产品说明
    • }
  • }
有问题的行是:
@foreach(category.Products.OrderBy(a=>a.SortOrder)中的var-product)
,因为这在视图中处理了一些我的模型

有没有办法在查询中对此进行排序

有没有办法在查询中对此进行排序

当然,查看模型:

public class CategoryViewModel
{
    public string Title { get; set; }
    public IEnumerable<ProductViewModel> Products { get; set; }
}

public class ProductViewModel
{
    public string Description { get; set; }
}
Index.cshtml
视图中,您可以摆脱丑陋的循环并使用显示模板:

@model IEnumerable<CategoryViewModel>
<ul>
    @Html.DisplayForModel()
</ul>
以及产品的显示模板内(
~/Views/Shared/ProductViewModel.cshtml

@model产品视图模型
  • @DisplayFor(x=>x.Description)

  • 作为对控制器操作的进一步改进,您可以使用它在域模型(EF对象)和视图模型之间进行映射,视图模型应传递给视图。

    您可以在查询中对此进行排序,但您已经在正确的位置(视图)处理了此操作。模型不关心它们是否被排序(即使您已经创建了一个排序顺序字段),而视图关心。如果您实现了其他“视图”(模型的消费者),他们可能不关心产品是否已排序,并且您不应该向其添加排序税。此外,您可能希望允许用户选择它们的排序方式(反向、按描述的字母顺序等),在这种情况下,您必须在视图中重新排序。在EF 4.1中,您不能执行
    。使用此扩展方法包括(c=>c.Products.OrderBy(a=>a.SortOrder))
    。@Merlyn:很好。。。在这种情况下,我可能也应该将类别的排序留给视图,因此模型只返回“普通”列表。出于我的兴趣,我该如何在查询中排序?@JD:Bala给出了一个可能有效的方法,但我对EF的了解还不足以确定(实际上我一点也不知道——只使用了NHibernate)。我猜您也可以在实体映射中完成,而不是在查询上下文时。
    @model IEnumerable<CategoryViewModel>
    <ul>
        @Html.DisplayForModel()
    </ul>
    
    @model CategoryViewModel
    <li>
        @Html.DisplayFor(x => x.Title)
        <ul>
            @Html.DisplayFor(x => x.Products)
        </ul>
    </li>
    
    @model ProductViewModel
    <li>
        @Html.DisplayFor(x => x.Description)
    </li>