Linq сортировать дочерний элемент в запросе - PullRequest
8 голосов
/ 23 июня 2011

У меня есть модель EF следующим образом:

enter image description here

На этой модели я, очевидно, могу использовать 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);

, чтобы показать продукты в порядке их сортировки SortOrderВ настоящее время я должен сделать:

<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 product in category.Products.OrderBy(a => a.SortOrder)), так как это обрабатывает немного моей модели в представлении.

Есть ли способ отсортировать это взапрос?

1 Ответ

8 голосов
/ 23 июня 2011

Есть ли способ отсортировать это в запросе?

Просмотр моделей курса:

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

public class ProductViewModel
{
    public string Description { get; set; }
}

и в вашем действии контроллера сделайте необходимое для заполнения этой модели представления:

public ActionResult Index()
{
    var categories = 
        (from category in context.Categories
         orderby category.SortOrder ascending
         select new CategoryViewModel
         {
             Title = category.Title,
             Products = category
                 .Products
                 .OrderBy(p => p.SortOrder)
                 .Select(p => new ProductViewModel
                 {
                     Description = p.Description
                 })
             }).ToList(); 
        ).ToList();
    return View(categories);
}

и в представлении Index.cshtml вы можете избавиться от уродливых циклов и использовать шаблоны отображения:

@model IEnumerable<CategoryViewModel>
<ul>
    @Html.DisplayForModel()
</ul>

и внутри шаблона отображения для категории (~/Views/Shared/CategoryViewModel.cshtml)

@model CategoryViewModel
<li>
    @Html.DisplayFor(x => x.Title)
    <ul>
        @Html.DisplayFor(x => x.Products)
    </ul>
</li>

и внутри шаблона отображения для продукта (~/Views/Shared/ProductViewModel.cshtml)

@model ProductViewModel
<li>
    @Html.DisplayFor(x => x.Description)
</li>

В качестве дальнейшего улучшения действия контроллера вы можете использовать AutoMapper для сопоставления между вашими моделями доменов (объектами EF) и моделями представления, которые должны быть переданы в представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...