C# CS0266错误:无法隐式转换IQueryable至IOrderedIQueryable求助
解决CS0266:无法将IQueryable隐式转换为IOrderedIQueryable的问题
这个错误的根源非常明确:你一开始初始化request时用了orderby c.Id select c,此时变量的类型是IOrderedQueryable<RaidRequest>——但Where()方法返回的是普通的IQueryable<RaidRequest>,C#不允许把普通IQueryable隐式转换为IOrderedQueryable(后者是前者的子类,只能向上兼容,不能向下隐式转换)。这和视图完全无关,纯粹是后端C#的类型匹配问题,分页前没暴露是因为当时没有对变量做跨类型的重新赋值操作。
快速修复方案
把初始的request声明为普通的IQueryable<RaidRequest>,去掉预先的orderby,把默认排序逻辑放到switch的默认分支里。这样整个变量的类型始终保持为IQueryable,后续的筛选、排序操作都能正常赋值:
修改后的控制器代码:
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page) { ViewBag.CurrentSort = sortOrder; ViewBag.NameSurnameSortParm = sortOrder == "NameSurname" ? "NameSurname_desc" : "NameSurname"; ViewBag.ReasonSortParm = sortOrder == "Reason" ? "Reason_desc" : "Reason"; ViewBag.AccessSortParm = sortOrder == "Access" ? "Access_desc" : "Access"; ViewBag.UserOrAdminSortParm = sortOrder == "UserOrAdmin" ? "UserOrAdmin_desc" : "UserOrAdmin"; ViewBag.DepartmentSortParm = sortOrder == "Department" ? "Department_desc" : "Department"; ViewBag.UNCPathSortParm = sortOrder == "UNCPath" ? "UNCPath_desc" : "UNCPath"; if (searchString != null) { page = 1; } else { searchString = currentFilter; } ViewBag.CurrentFilter = searchString; // 初始化为普通IQueryable,不预先排序 var request = from c in _context.RaidRequest select c; if (!String.IsNullOrEmpty(searchString)) { request = request.Where(s => s.NameSurname.Contains(searchString)); } switch (sortOrder) { case "NameSurname_desc": request = request.OrderByDescending(c => c.NameSurname); break; case "NameSurname": // 补充原来缺失的升序分支 request = request.OrderBy(c => c.NameSurname); break; case "Reason": request = request.OrderBy(c => c.Reason); break; case "Reason_desc": request = request.OrderByDescending(c => c.Reason); break; case "Access": request = request.OrderBy(c => c.Access); break; case "Access_desc": request = request.OrderByDescending(c => c.Access); break; case "UserOrAdmin": request = request.OrderBy(c => c.UserOrAdmin); break; case "UserOrAdmin_desc": request = request.OrderByDescending(c => c.UserOrAdmin); break; case "Department": request = request.OrderBy(c => c.Department); break; case "Department_desc": request = request.OrderByDescending(c => c.Department); break; case "UNCPath": request = request.OrderBy(c => c.UNCPath); break; case "UNCPath_desc": request = request.OrderByDescending(c => c.UNCPath); break; default: // 默认按Id升序,替代原来的初始排序逻辑 request = request.OrderBy(c => c.Id); break; } int pageSize = 10; int pageNumber = (page ?? 1); return View(request.ToPagedList(pageNumber, pageSize)); }
额外说明
- 我补充了你原来switch中缺失的
NameSurname升序分支——否则当用户点击NameSurname的升序排序时,代码会走到默认分支,不符合预期。 - 将默认排序放到switch的default分支是为了保证分页结果的一致性:分页查询必须基于有序的数据集,否则每次加载分页数据可能返回不同的结果。
内容的提问来源于stack exchange,提问作者Renārs Treimanis
相关产品推荐
相关产品推荐

