Asp.net mvc 3 ASP.NET MVC 3页面列表。方法';跳过';仅支持LINQ to实体中的排序输入。

Asp.net mvc 3 ASP.NET MVC 3页面列表。方法';跳过';仅支持LINQ to实体中的排序输入。,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,为什么它在返回视图(contacts.ToPagedList(pageNumber,pageSize))中出现错误语句索引方法中的错误: 方法“Skip”仅支持LINQ to实体中的排序输入。方法“OrderBy”必须在方法“Skip”之前调用。 using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Linq; using System.W

为什么它在返回视图(contacts.ToPagedList(pageNumber,pageSize))中出现错误语句索引方法中的错误:
方法“Skip”仅支持LINQ to实体中的排序输入。方法“OrderBy”必须在方法“Skip”之前调用。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PhoneBook.Models;
using PagedList;

namespace PhoneBook.Controllers
{ 
public class ContactsController : Controller
{
    private PhoneDBContext db = new PhoneDBContext();

    //
    // GET: /Contacts/

    public ViewResult Index(string searchString, string sortOrder, Contact model, string currentFilter, int? page)
    {
        ViewBag.CurrentSort = sortOrder;

        ViewBag.FNameSortParm = sortOrder == "FName asc"? "FName desc" : "FName asc";
        ViewBag.DateSortParm = sortOrder == "Date asc" ? "Date desc" : "Date asc";
        ViewBag.LNameSortParm = sortOrder == "LName asc" ? "LName desc" : "LName asc";
        ViewBag.CompSortParm = sortOrder == "Company asc" ? "Company desc" : "Company asc";
        ViewBag.MobSortParm = sortOrder == "Mob asc" ? "Mob desc" : "Mob asc";
        ViewBag.TelSortParm = sortOrder == "Tel asc" ? "Tel desc" : "Tel asc";

        if (Request.HttpMethod == "GET") { searchString = currentFilter; }
        else {page = 1;}
        ViewBag.CurrentFilter = searchString;
        var contacts = from m in db.Contacts
                       select m;

        switch (sortOrder)
        {
            case "FName desc":
                contacts = contacts.OrderByDescending(s => s.FirstName);
                break;
            case "FName asc":
                contacts = contacts.OrderBy(s => s.FirstName);
                break;
            case "LName desc":
                contacts = contacts.OrderByDescending(s => s.LastName);
                break;
            case "LName asc":
                contacts = contacts.OrderBy(s => s.LastName);
                break;
            case "Company desc":
                contacts = contacts.OrderByDescending(s => s.Company);
                break;
            case "Company asc":
                contacts = contacts.OrderBy(s => s.Company);
                break;
            case "Date desc":
                contacts = contacts.OrderByDescending(s => s.DateAdded);
                break;
            case "Date asc":
                contacts = contacts.OrderBy(s => s.DateAdded);
                break;
            case "Mob desc":
                contacts = contacts.OrderByDescending(s => s.MobileNumber);
                break;
            case "Mob asc":
                contacts = contacts.OrderBy(s => s.MobileNumber);
                break;
            case "Tel desc":
                contacts = contacts.OrderByDescending(s => s.TelephoneNumber);
                break;
            case "Tel asc":
                contacts = contacts.OrderBy(s => s.TelephoneNumber);
                break;
        }


        if (!String.IsNullOrEmpty(searchString))
        {
            contacts = contacts.Where(s => s.LastName.ToUpper().Contains(searchString)||s.FirstName.ToUpper().Contains(searchString)||s.Company.ToUpper().Contains(searchString));
        }

        int pageSize = 3;
        int pageNumber = (page ?? 1);

       return View(contacts.ToPagedList(pageNumber, pageSize));
    }

    //
    // GET: /Contacts/Details/5

    public ViewResult Details(int id)
    {
        Contact contact = db.Contacts.Find(id);
        return View(contact);
    }

    //
    // GET: /Contacts/Create

    public ActionResult Create()
    {
        return View();
    } 

    //
    // POST: /Contacts/Create

    [HttpPost]
    public ActionResult Create(Contact contact)
    {
        if (ModelState.IsValid)
        {
            db.Contacts.Add(contact);
            contact.DateAdded = DateTime.Now;
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        return View(contact);
    }

    //
    // GET: /Contacts/Edit/5

    public ActionResult Edit(int id=0)
    {

        Contact contact = db.Contacts.Find(id);

        if (contact == null)    { return HttpNotFound(); } // returns blank page if id is not valid
        return View(contact);
    }

    //
    // POST: /Contacts/Edit/5

    [HttpPost]
    public ActionResult Edit(Contact contact)
    {
        if (ModelState.IsValid)
        {


            db.Entry(contact).State = EntityState.Modified;
            contact.DateAdded = DateTime.Now;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(contact);
    }

    //
    // GET: /Contacts/Delete/5

    public ActionResult Delete(int id)
    {
        Contact contact = db.Contacts.Find(id);
        if (contact == null) { return HttpNotFound(); }
        return View(contact);
    }

    //
    // POST: /Contacts/Delete/5

    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {            
        Contact contact = db.Contacts.Find(id);
        if (contact == null) { return HttpNotFound(); }
        db.Contacts.Remove(contact);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    public ActionResult SearchIndex(string searchString)
    {
        var contacts = from m in db.Contacts
                     select m;

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

        return View(contacts);
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }


}
}
下面是Index.cshtml代码:

@model PagedList.IPagedList<PhoneBook.Models.Contact>
@{
    ViewBag.Title = "Phone Book";
}

<p>

     @using (Html.BeginForm()){   
         <p> Search: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string) 
         <input type="submit" value="Go" /></p>
        }
</p>


<p>
    @Html.ActionLink("Create New", "Create")
</p>

<table>
    <tr>
        <th>
             @Html.ActionLink("First Name", "Index", new { sortOrder=ViewBag.FNameSortParm, currentFilter=ViewBag.CurrentFilter })
        </th>
        <th>
             @Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.LNameSortParm, currentFilter = ViewBag.CurrentFilter })
        </th>
        <th>
            @Html.ActionLink("Mobile Num", "Index", new { sortOrder = ViewBag.MobSortParm, currentFilter = ViewBag.CurrentFilter })
        </th>
        <th>
            @Html.ActionLink("Tel Num", "Index", new { sortOrder = ViewBag.TelSortParm, currentFilter = ViewBag.CurrentFilter })
        </th>
        <th>
             @Html.ActionLink("Company", "Index", new { sortOrder = ViewBag.CompSortParm, currentFilter = ViewBag.CurrentFilter })
        </th>
        <th>
           @Html.ActionLink("Date Added/Updated", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter })
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.FirstName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LastName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MobileNumber)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TelephoneNumber)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Company)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.DateAdded)
        </td>
        <td>
            @Html.ActionLink("Details", "Details", new { id=item.ID })
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) 
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

</table>

<div>
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
    of @Model.PageCount

    @if (Model.HasPreviousPage)
    {
        @Html.ActionLink("<<", "Index", new { page = 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
        @Html.Raw(" ");
        @Html.ActionLink("< Prev", "Index", new { page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
    }
    else
    {
        @:<<
        @Html.Raw(" ");
        @:< Prev
    }

    @if (Model.HasNextPage)
    {
        @Html.ActionLink("Next >", "Index", new { page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
        @Html.Raw(" ");
        @Html.ActionLink(">>", "Index", new { page = Model.PageCount, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
    }
    else
    {
        @:Next >
        @Html.Raw(" ")
        @:>>
    }
</div>
@model PagedList.IPagedList
@{
ViewBag.Title=“电话簿”;
}

@使用(Html.BeginForm()){
搜索:@Html.TextBox(“搜索字符串”,ViewBag.CurrentFilter为字符串)

}

@ActionLink(“新建”、“创建”)

@ActionLink(“名字”,“索引”,新{sortOrder=ViewBag.FNameSortParm,currentFilter=ViewBag.currentFilter}) @ActionLink(“姓氏”,“索引”,新{sortOrder=ViewBag.LNameSortParm,currentFilter=ViewBag.currentFilter}) @ActionLink(“Mobile Num”,“Index”,new{sortOrder=ViewBag.MobSortParm,currentFilter=ViewBag.currentFilter}) @ActionLink(“电话号码”,“索引”,新的{sortOrder=ViewBag.TelSortParm,currentFilter=ViewBag.currentFilter}) @ActionLink(“公司”,“索引”,新{sortOrder=ViewBag.CompSortParm,currentFilter=ViewBag.currentFilter}) @ActionLink(“添加/更新的日期”,“索引”,新的{sortOrder=ViewBag.DateSortParm,currentFilter=ViewBag.currentFilter}) @foreach(模型中的var项目){ @DisplayFor(modelItem=>item.FirstName) @DisplayFor(modelItem=>item.LastName) @DisplayFor(modelItem=>item.MobileNumber) @DisplayFor(modelItem=>item.TelephoneNumber) @DisplayFor(modelItem=>item.Company) @DisplayFor(modelItem=>item.DateAdd) @ActionLink(“详细信息”,“详细信息”,新的{id=item.id}) @ActionLink(“编辑”,“编辑”,新的{id=item.id}) @ActionLink(“删除”,“删除”,新的{id=item.id}) } 页码@(Model.PageCount”,“Index”,新{page=Model.PageCount,sortOrder=ViewBag.CurrentSort,currentFilter=ViewBag.currentFilter}) } 其他的 { @:下一步> @Html.Raw(“”) @:>> }
尝试以下三种更改

  • 将此代码置于switch语句之前:

    if (!String.IsNullOrEmpty(searchString))
    {
        contacts = contacts.Where(s => s.LastName.ToUpper().Contains(searchString)||s.FirstName.ToUpper().Contains(searchString)||s.Company.ToUpper().Contains(searchString));
    }
    
  • 在switch语句中添加一个
    default
    大小写,并使其抛出

    switch (sortOrder) {
        case ...:
            ...
        default:
            throw new ArgumentException("Bad sort order specified", "sortOrder");
    }
    
  • 使用类型
    IOrderedQueryable

    IOrderedQueryable orderedContacts;
    开关(分拣机)
    {
    案例“FName desc”:
    orderedContacts=contacts.OrderByDescending(s=>s.FirstName);
    打破
    ...
    }
    ...
    返回视图(orderedContacts.ToPagedList(pageNumber,pageSize));
    

  • 谢谢第二个代码片段帮助了我,我认为错误是由
    开关(sortOrder)
    块中的
    sortOrder
    变量引起的。ReturnView对如何处理排序器感到困惑,因为它不是为页面列表显示而订购的。。如果我错了,请纠正我。。。然后我安装了最新版本的页面列表。。。谢谢你帮我解决这个问题。这不是一个完整的答案。请说明这是怎么回事。在分页之前是否将整个数据库表加载到内存中?坏主意。
    IOrderedQueryable<T> orderedContacts;
    switch (sortOrder)
    {
        case "FName desc":
            orderedContacts = contacts.OrderByDescending(s => s.FirstName);
            break;
        ...
    }
    
    ...
    
    return View(orderedContacts.ToPagedList(pageNumber, pageSize));
    
    return View(orderedContacts.ToList().ToPagedList(pageNumber, pageSize));