排序
官方文档应该说的很明白,有疑问可以给我私信
首先,要操作的模型对象应该是已经完成增删改查逻辑。话不多说,上代码。
public async Task<IActionResult> Index(string sortOrder)
{
ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
IQueryable<_context> students = from s in _context.Students
select s;
switch (sortOrder)
{
case "name_desc":
students = students.OrderByDescending(s => s.LastName);
break;
case "Date":
students = students.OrderBy(s => s.EnrollmentDate);
break;
case "date_desc":
students = students.OrderByDescending(s => s.EnrollmentDate);
break;
default:
students = students.OrderBy(s => s.LastName);
break;
}
return View(await students.AsNoTracking().ToListAsync());
}
此代码接收来自 URL ,这里其实是路由配置:asp-route-sortOrder="@ViewData["NameSortParm"]">中的查询字符串的 sortOrder
参数。 查询字符串值由 ASP.NET Core MVC 提供,作为操作方法的参数。 该参数将是一个字符串,可为“Name”或“Date”,可选择后跟下划线和字符串“desc”来指定降序。 默认排序顺序为升序。
首次请求索引页时,没有任何查询字符串。 学生按照姓氏升序显示,这是 switch
语句中的 fall-through 事例所建立的默认值。 当用户单击列标题超链接时,查询字符串中会提供相应的 sortOrder
值。视图使用两个 ViewData
元素(NameSortParm 和 DateSortParm)来为列标题超链接配置相应的查询字符串值。
注意这里:
ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
这些一个三元运算。 第一个指定如果 sortOrder
参数为 NULL 或空,则应将 NameSortParm 设置为“name_desc”;否则,应将其设置为空字符串。 通过这两个语句,视图可如下设置列标题超链接:
当前排序顺序 | 姓氏超链接 | 日期超链接 |
---|---|---|
姓氏升序 | descending | ascending |
姓氏降序 | ascending | ascending |
日期升序 | ascending | descending |
日期降序 | ascending | ascending |
该方法使用 LINQ to Entities 指定要作为排序依据的列。 该代码在 switch 语句之前创建一个 IQueryable
变量,在 switch 语句中对其进行修改,并在 switch
语句后调用 ToListAsync
方法。 当创建和修改 IQueryable
变量时,不会向数据库发送任何查询。 只有通过调用 ToListAsync
之类的方法将 IQueryable
对象转换为集合,查询才会执行。 因此,此代码导致直到 return View
语句才会执行单个查询。
PS:什么是IQueryable
?
首先知道什么是IEnumberable
IEnumberable接口
公开枚举类:该枚举器支持在指定类型的集合上进行简单迭代。也就是说:实现了此接口的object