为什么OrderBy和ThenBy在Controller中工作,而不是View?

时间:2014-01-21 00:13:50

标签: asp.net-mvc sql-order-by

我在Controller中有以下代码:

newclass.Brands = db.Brands.OrderByDescending(x => x.Brand1 != "Not classified").ThenBy(x => x.Brand1);

当我在View:

中使用它创建一个SelectList时
@Html.DropDownList("Brand_id", new SelectList(Model.Brands, "Brand_id", "Brand1"), new {@class="dropdown_edit"})

它完美运作 - 它按字母顺序放置品牌列表,并在列表底部放置“未分类”选项。

然而,当我有这个是控制器时:

newclass.Brands = db.Brands;

这在视图中:

@Html.DropDownList("Brand_id", new SelectList(Model.Brands.OrderByDescending(x => x.Brand1 != "Not classified").ThenBy(x => x.Brand1), "Brand_id", "Brand1"), new {@class="dropdown_edit"})

DropDownList总是默认使用ThenBy语句中的指令,就像第一个OrderBy被ThenBy覆盖一样 - 不应该是这种情况?

我错过了什么?

编辑: 我正在使用EF,而newclass是一个源自EF类品牌的Viewmodel。类定义是:

 public class Class1
{
    public IEnumerable<Brand> Brands { get; set; }
}

1 个答案:

答案 0 :(得分:0)

原因可能是因为Brands在到达View时尚未被查询,并且它丢失了一些db上下文。视图应始终接收IEnumerable,这些newclass.Brands = db.Brands.ToList(); // Execute the query, do not use deferred query 不会延迟并且已经从EF查询过,因此您应该强制在控制器上执行:

在控制器中:

IEnumerable

然后视图将收到一个简单的.OrderByDescending(x => x.Brand1 != "Not classified"),并且应该正确地进行排序。

.OrderByDescending(x => !x.Brand1.Equals("Not classified", System.StringComparison.InvariantCultureIgnoreCase)) 将使用新的布尔字段进行排序,首先使用真值。但是,请确保您没有错误输入控制器或视图之间的等式或“未分类”。

使用布尔排序查看类似问题:Linq order by boolean

我发现您发布的代码没有任何问题,请确保您没有输错。

对于不区分大小写的字符串相关问题,您应该使用:

{{1}}