MVC Linq OrderBy не сохраняется в Razor View

1

У меня есть частичный вид в моем веб-проекте, который отвечает за отображение элементов в меню навигации. Модели элементов меню навигации имеют на них свойство SortOrder, которое отвечает за отображение в том порядке, в котором они отображаются. Значение по умолчанию для unsorted равно 0. Поэтому мне нужно заказать любое значение больше 0, а затем имя элементов меню, которые не отсортированы. Проблема в том, что мой запрос linq не учитывает мой порядок сортировки. Вместо этого сначала отображаются элементы с порядком сортировки 0. Я использую MVC 4 с целью.Net framework 4.5. Спасибо за любой вклад.

Ниже мой код:

@model IEnumerable<Models.Item>
@helper ShowItems(List<Models.Item> items)
{
<ul>
    @foreach(var item in items)
    {
        <li>
            @item.DisplayName
            @if(Model.Any(x => x.ParentId == item.Id))
            {
                @ShowItem(Model.Where(x => x.ParentId == item.Id).OrderBy(x => x.SortOrder.Value > 0).ThenBy(y => y.DisplayName).ToList())
            }
        </li>
    }
</ul>
}
@ShowItems(Model.Where(x => !x.ParentId.HasValue || x.ParentId.Value == 0).OrderBy(x => x.SortOrder.Value > 0).ThenBy(y => y.DisplayName).ToList());
Теги:
linq
razor
asp.net-mvc

3 ответа

1
Лучший ответ

OrderBy принимает выражение, значение которого оценивается, а затем упорядочивается по результирующему значению. Таким образом, в вашем случае x => x.SortOrder.Value> 0 является логической оценкой - результатом является ложь. Я считаю, что приравнивается к 0 или 1, поэтому при сортировке ваше ложное придет до ваших истин. Все, что с SortOrder.Value == 0 будет отображаться первым. Вы сравниваете яблоки с апельсинами (булевы и целые числа)

Попробуйте сопоставить апельсины с яблоками следующим образом:

OrderBy(x => x.SortOrder.Value > 0 ? 0 : 1).ThenBy(...);

Теперь вы сортируете по целым числам, затем целыми числами, а не логическими, затем целыми числами.

  • 0
    Gahh. Вы правы, Адам. Спасибо! Это был долгий день.
0

Это даст вам список в порядке возрастания по полю SortOrder за исключением того, что нули находятся в конце:

OrderBy(x => x.SortOrder.Value == 0 ? Int32.MaxValue : x.SortOrder.Value)
0

используйте OrderByDescending и order by x.SortOrder.Value

@ShowItems(Model.Where(x => !x.ParentId.HasValue || x.ParentId.Value == 0)
.OrderByDescending(x => x.SortOrder.Value)
.ThenBy(y => y.DisplayName).ToList());
  • 0
    У Адама был ответ, который я искал. Я думал, что упомянул, но, похоже, я не был достаточно конкретным, чтобы я искал, чтобы мой порядок возрастал вначале для любого значения больше 0 (Пример: 1,2,3,0,0).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню