C# MVC Linq OrderBy未在Razor视图中持久化

C# MVC Linq OrderBy未在Razor视图中持久化,c#,asp.net,asp.net-mvc,linq,razor,C#,Asp.net,Asp.net Mvc,Linq,Razor,我的web项目中有一个局部视图,负责在导航菜单中显示项目。导航菜单项模型上有一个SortOrder属性,该属性负责显示模型的显示顺序。未排序的默认值为0。因此,我需要按大于0的任何值排序,然后按未排序的菜单项的名称排序。问题是我的linq查询不尊重我的排序顺序。而是首先显示sortorder值为0的项。我正在使用MVC4和.NETFramework目标4.5。谢谢你的意见 下面是我的代码: @model IEnumerable<Models.Item> @helper ShowIte

我的web项目中有一个局部视图,负责在导航菜单中显示项目。导航菜单项模型上有一个SortOrder属性,该属性负责显示模型的显示顺序。未排序的默认值为0。因此,我需要按大于0的任何值排序,然后按未排序的菜单项的名称排序。问题是我的linq查询不尊重我的排序顺序。而是首先显示sortorder值为0的项。我正在使用MVC4和.NETFramework目标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());
@model IEnumerable
@助手显示项(列表项)
{
    @foreach(项目中的var项目) {
  • @item.DisplayName @if(Model.Any(x=>x.ParentId==item.Id)) { @ShowItem(Model.Where(x=>x.ParentId==item.Id).OrderBy(x=>x.SortOrder.Value>0).然后by(y=>y.DisplayName).ToList()) }
  • }
} @ShowItems(Model.Where(x=>!x.ParentId.HasValue | | x.ParentId.Value==0).OrderBy(x=>x.SortOrder.Value>0).然后by(y=>y.DisplayName).ToList());
OrderBy接受一个表达式,该表达式的值经过计算,然后按结果值排序。因此,在您的示例中,x=>x.SortOrder.Value>0是一个布尔计算-结果为true或false。我相信这等于0或1,所以当排序时,你的错误将出现在你的真实之前。SortOrder.Value==0的任何内容都将首先显示。 你在把苹果和桔子(布尔数和整数)进行比较

尝试将桔子映射到苹果,如下所示:

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

现在你是按整数排序,然后按整数排序,而不是按布尔值,然后按整数排序

使用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());

这将按
SortOrder
字段的升序为您提供列表,但末尾为零的情况除外:

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

是否需要按升序排列的非零排序器值?是。我没有提到那个细节。我的道歉。你说得对,亚当。谢谢这是漫长的一天,亚当找到了我想要的答案。我想我已经提到了,但似乎我不够具体,我正在寻找我的排序是上升的任何值大于0(例如:1,2,3,0,0)。