我在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; }
}
答案 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}}