【问题标题】:CS0266 cannot convert typeCS0266 无法转换类型
【发布时间】:2019-11-29 08:53:26
【问题描述】:

我有一个错误:

CS0266 C# 不能隐式转换类型 'System.Linq.IQueryable' 到 'System.Linq.IOrderedIQueryable'。一个 存在显式转换(您是否缺少演员表?)

这是我的控制器:

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;

    var request = from c in _context.RaidRequest
                    orderby c.Id
                    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 "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;
    }

    int pageSize = 10;
    int pageNumber = (page ?? 1);
    return View(request.ToPagedList(pageNumber, pageSize));
}

这部分坏了:

if (!String.IsNullOrEmpty(searchString))
{
    request = request.Where(s => s.NameSurname.Contains(searchString));
}

你能解释一下该怎么做吗? 我一个字一个字地跟着教程。在我添加分页之前它一直有效。 会不会是我的观点?

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework


    【解决方案1】:

    您的所有查询都包含一个 orderby,因此返回一个 IOrderedQueryable,除了您使用搜索字符串的查询。此查询返回IQueryable

    由于IOrderedQueryable 继承自IQueryable,因此您可以将IOrderedQueryable 分配给IQueryable,但反之则不行。

    从第一个查询中删除orderby,它会变成IQueryable,在switch语句中添加default:进行默认排序。这也将阻止您对结果查询进行两次排序。

        var request = from c in _context.RaidRequest
                          select c;
    
        // Your code
        switch (sortOrder)
            {
                // other cases
                case "UNCPath_desc":
                    request = request.OrderByDescending(c => c.UNCPath);
                    break;
                default: 
                    request = request.OrderBy(c => c.Id);
                    break;
            }
    

    【讨论】:

    • 这对我的情况没有帮助。仍然是同样的错误。我刚刚在错误旁边收到 1 条新消息:IDE0066: use 'switch' expression
    • 您是否从第一个查询中删除了 orderby?
    • 不,我没有,我的错:D
    • 既然你已经熟悉了我的控制器,你能帮我看看我的视图吗?它有错误 CS0012:类型“MvcHtmlString”是在未引用的程序集中定义的。您必须添加对程序集“System.Web.Mvc,Version=4.0.0.0,Culture=neutral,PublicKeyToken=blablabla”的引用跨度>
    • 创建一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多