【问题标题】:MVC Linq OrderBy not persisting in Razor ViewMVC Linq OrderBy 不保留在 Razor 视图中
【发布时间】:2014-05-27 01:01:59
【问题描述】:

我的 Web 项目中有一个局部视图,它负责在导航菜单中显示项目。导航菜单项模型上有一个 SortOrder 属性,负责显示它们出现的顺序。未排序的默认值为 0。因此,我需要按任何大于 0 的值排序,然后按未排序的菜单项的名称排序。问题是我的 linq 查询不尊重我的排序顺序。相反,它首先显示排序顺序值为 0 的项目。我将 MVC 4 与 .Net 框架目标 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());

【问题讨论】:

  • 您需要升序排列的非零 SortOrder 值吗?
  • 是的。我没有提到那个细节。我很抱歉。

标签: c# asp.net asp.net-mvc linq razor


【解决方案1】:

OrderBy 接受一个表达式,其值被计算,然后按结果值排序。所以在你的情况下 x => x.SortOrder.Value > 0 是一个布尔评估 - 导致真假。我相信这等于 0 或 1,所以在排序时,你的错误会出现在你的真实之前。任何带有 SortOrder.Value == 0 的东西都会首先出现。 您正在将苹果与橙子进行比较(布尔值和整数)

尝试像这样将橙子映射到苹果:

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

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

【讨论】:

  • 呸。你是对的,亚当。谢谢!这是漫长的一天。
【解决方案2】:

使用 OrderByDescending 并按 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 的值进行升序(例如:1,2,3,0,0)。
【解决方案3】:

这将按SortOrder 字段的升序为您提供列表,但最后是零:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多