ASP.NET MVC 3 PagedList。该方法“跳过”仅支持在LINQ到实体排序的输入。 [英] ASP.NET MVC 3 PagedList. The method 'Skip' is only supported for sorted input in LINQ to Entities.

查看:133
本文介绍了ASP.NET MVC 3 PagedList。该方法“跳过”仅支持在LINQ到实体排序的输入。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么提示错误在返回查看(contacts.ToPagedList(PAGENUMBER,pageSize的)); 语句在索引方法的错误:
的方法跳过仅支持在LINQ到实体排序的输入。该方法排序依据必须在方法'跳过'之前被调用。

 使用系统;
使用System.Collections.Generic;
使用System.Data这;
使用System.Data.Entity的;
使用System.Linq的;
使用的System.Web;
使用System.Web.Mvc;
使用PhoneBook.Models;
使用PagedList;命名空间PhoneBook.Controllers
{
公共类ContactsController:控制器
{
    私人PhoneDBContext DB =新PhoneDBContext();    //
    // GET:/联系人/    公众的ViewResult指数(字符串搜索字符串,字符串中将sortOrder,接触模型,串currentFilter,诠释?页)
    {
        ViewBag.CurrentSort =中将sortOrder;        ViewBag.FNameSortParm =中将sortOrder ==FName参数ASC? FName参数说明:FName参数ASC;
        ViewBag.DateSortParm =中将sortOrder ==日期递增? 日期递减:日期递增
        ViewBag.LNameSortParm =中将sortOrder ==LName的ASC? LName的说明:LName的ASC;
        ViewBag.CompSortParm =中将sortOrder ==公司ASC? 公司说明:公司ASC;
        ViewBag.MobSortParm =中将sortOrder ==暴民ASC? 暴民说明:暴民ASC;
        ViewBag.TelSortParm =中将sortOrder ==电话ASC? 电话说明:电话ASC;        如果(Request.HttpMethod ==GET){搜索字符串= currentFilter; }
        其他{页面= 1;}
        ViewBag.CurrentFilter =搜索字符串;
        VAR接触=从米db.Contacts
                       选择米;        开关(中将sortOrder)
        {
            案FName参数说明:
                接触= contacts.OrderByDescending(S = GT; s.FirstName);
                打破;
            案FName参数ASC:
                接触= contacts.OrderBy(S = GT; s.FirstName);
                打破;
            案LName的说明:
                接触= contacts.OrderByDescending(S = GT; s.LastName);
                打破;
            案LName的ASC:
                接触= contacts.OrderBy(S = GT; s.LastName);
                打破;
            案公司说明:
                接触= contacts.OrderByDescending(S = GT; s.Company);
                打破;
            案公司ASC:
                接触= contacts.OrderBy(S = GT; s.Company);
                打破;
            案日期递减:
                接触= contacts.OrderByDescending(S = GT; s.DateAdded);
                打破;
            案日期递增:
                接触= contacts.OrderBy(S = GT; s.DateAdded);
                打破;
            案暴民说明:
                接触= contacts.OrderByDescending(S = GT; s.MobileNumber);
                打破;
            案暴民ASC:
                接触= contacts.OrderBy(S = GT; s.MobileNumber);
                打破;
            案电话说明:
                接触= contacts.OrderByDescending(S = GT; s.TelephoneNumber);
                打破;
            案电话ASC:
                接触= contacts.OrderBy(S = GT; s.TelephoneNumber);
                打破;
        }
        如果(!String.IsNullOrEmpty(搜索字符串))
        {
            接触= contacts.Where(S = GT; s.LastName.ToUpper().Contains(searchString)||s.FirstName.ToUpper().Contains(searchString)||s.Company.ToUpper().Contains(searchString));
        }        INT的pageSize = 3;
        INT PAGENUMBER =(第53页1);       返回查看(contacts.ToPagedList(PAGENUMBER,pageSize的));
    }    //
    // GET:/联系人/详细资料/ 5    公众的ViewResult详细信息(INT ID)
    {
        联系方式联系方式= db.Contacts.Find(ID);
        返回查看(接触​​);
    }    //
    // GET:/联系人/创建    公众的ActionResult的Create()
    {
        返回查看();
    }    //
    // POST:/联系人/创建    [HttpPost]
    公众的ActionResult创建(联系方式联系方式)
    {
        如果(ModelState.IsValid)
        {
            db.Contacts.Add(接触);
            contact.DateAdded = DateTime.Now;
            db.SaveChanges();
            返回RedirectToAction(「指数」);
        }        返回查看(接触​​);
    }    //
    // GET:/联系人/编辑/ 5    公众的ActionResult编辑(INT ID = 0)
    {        联系方式联系方式= db.Contacts.Find(ID);        如果(接触== NULL){返回HttpNotFound(); } //返回空白页,如果ID无效
        返回查看(接触​​);
    }    //
    // POST:/联系人/编辑/ 5    [HttpPost]
    公众的ActionResult编辑(联系方式联系方式)
    {
        如果(ModelState.IsValid)
        {
            db.Entry(接触).STATE = EntityState.Modified;
            contact.DateAdded = DateTime.Now;
            db.SaveChanges();
            返回RedirectToAction(「指数」);
        }
        返回查看(接触​​);
    }    //
    // GET:/联系人/删除/ 5    公众的ActionResult删除(INT ID)
    {
        联系方式联系方式= db.Contacts.Find(ID);
        如果(接触== NULL){返回HttpNotFound(); }
        返回查看(接触​​);
    }    //
    // POST:/联系人/删除/ 5    [HttpPost,ActionName(删除)]
    公众的ActionResult DeleteConfirmed(INT ID)
    {
        联系方式联系方式= db.Contacts.Find(ID);
        如果(接触== NULL){返回HttpNotFound(); }
        db.Contacts.Remove(接触);
        db.SaveChanges();
        返回RedirectToAction(「指数」);
    }    公众的ActionResult SearchIndex(字符串搜索字符串)
    {
        VAR接触=从米db.Contacts
                     选择米;        如果(!String.IsNullOrEmpty(搜索字符串))
        {
            接触= contacts.Where(S = GT; s.LastName.Contains(搜索字符串));
        }        返回查看(联系人);
    }    保护覆盖无效的Dispose(BOOL处置)
    {
        db.Dispose();
        base.Dispose(处置);
    }
}
}

下面是Index.cshtml code:

  @model PagedList.IPagedList< PhoneBook.Models.Contact>
@ {
    ViewBag.Title =电话簿
}&所述p为H.;     @using(Html.BeginForm()){
         &所述p为H.;搜索:@ Html.TextBox(SearchString在ViewBag.CurrentFilter为字符串)
         <输入类型=提交值=转到/>< / P>
        }
&所述; / P>
&所述p为H.;
    @ Html.ActionLink(新建,创建)
&所述; / P><表>
    &所述; TR>
        <第i个
             @ Html.ActionLink(名,索引,新的{中将sortOrder = ViewBag.FNameSortParm,currentFilter = ViewBag.CurrentFilter})
        < /第i
        <第i个
             @ Html.ActionLink(姓,索引,新的{中将sortOrder = ViewBag.LNameSortParm,currentFilter = ViewBag.CurrentFilter})
        < /第i
        <第i个
            @ Html.ActionLink(移动民,索引,新的{中将sortOrder = ViewBag.MobSortParm,currentFilter = ViewBag.CurrentFilter})
        < /第i
        <第i个
            @ Html.ActionLink(电话民,索引,新的{中将sortOrder = ViewBag.TelSortParm,currentFilter = ViewBag.CurrentFilter})
        < /第i
        <第i个
             @ Html.ActionLink(本公司,索引,新的{中将sortOrder = ViewBag.CompSortParm,currentFilter = ViewBag.CurrentFilter})
        < /第i
        <第i个
           @ Html.ActionLink(上架日期/更新,索引,新的{中将sortOrder = ViewBag.DateSortParm,currentFilter = ViewBag.CurrentFilter})
        < /第i
        百分位>< /第i
    < / TR>@foreach(以型号VAR项){
    &所述; 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(详细信息,详细信息,新{ID = item.ID})
            @ Html.ActionLink(编辑,编辑,新{ID = item.ID})
            @ Html.ActionLink(删除,删除,新{ID = item.ID})
        < / TD>
    < / TR>
}< /表>< D​​IV>
    页@(Model.PageCount< Model.PageNumber 0:Model.PageNumber)
    动@ Model.PageCount    @if(Model.Has previousPage)
    {
        @ Html.ActionLink(<<,索引,新页面{= 1,中将sortOrder = ViewBag.CurrentSort,currentFilter = ViewBag.CurrentFilter})
        @ Html.Raw();
        @ Html.ActionLink(其中p preV,索引,新的{页= Model.PageNumber - 1,中将sortOrder = ViewBag.CurrentSort,currentFilter = ViewBag.CurrentFilter})
    }
    其他
    {
        @:其中;&下;
        @ Html.Raw();
        @:或其可preV
    }    @if(Model.HasNextPage)
    {
        @ Html.ActionLink(下一步>中,索引,新的{页= Model.PageNumber + 1 =中将sortOrder ViewBag.CurrentSort,currentFilter = ViewBag.CurrentFilter})
        @ Html.Raw();
        @ Html.ActionLink(>>中,索引,新的{页= Model.PageCount,中将sortOrder = ViewBag.CurrentSort,currentFilter = ViewBag.CurrentFilter})
    }
    其他
    {
        @:下一个>
        @ Html.Raw()
        @:>>
    }
< / DIV>


解决方案

请尝试以下三个转变。


  1. 将这个code的的switch语句:

     如果(!String.IsNullOrEmpty(搜索字符串))
    {
        接触= contacts.Where(S = GT; s.LastName.ToUpper().Contains(searchString)||s.FirstName.ToUpper().Contains(searchString)||s.Company.ToUpper().Contains(searchString));
    }


  2. 在您的switch语句添加默认的情况下,并使其抛出。

     开关(中将sortOrder){
        案件 ...:
            ...
        默认:
            抛出新的ArgumentException(中将sortOrder坏指定排序顺序);
    }


  3. 使用类型 IOrderedQueryable< T>

      IOrderedQueryable< T> orderedContacts;
    开关(中将sortOrder)
    {
        案FName参数说明:
            orderedContacts = contacts.OrderByDescending(S => s.FirstName);
            打破;
        ...
    }...返回查看(orderedContacts.ToPagedList(PAGENUMBER,pageSize的));


Why is it it gives error in return View(contacts.ToPagedList(pageNumber, pageSize)); statement the error in the Index method : The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method '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);
    }


}
}

below is the Index.cshtml code:

@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>

解决方案

Try the following three changes.

  1. Put this code before the switch statement:

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

  2. Add a default case in your switch statement, and make it throw.

    switch (sortOrder) {
        case ...:
            ...
        default:
            throw new ArgumentException("Bad sort order specified", "sortOrder");
    }
    

  3. Use the type IOrderedQueryable<T>.

    IOrderedQueryable<T> orderedContacts;
    switch (sortOrder)
    {
        case "FName desc":
            orderedContacts = contacts.OrderByDescending(s => s.FirstName);
            break;
        ...
    }
    
    ...
    
    return View(orderedContacts.ToPagedList(pageNumber, pageSize));
    

这篇关于ASP.NET MVC 3 PagedList。该方法“跳过”仅支持在LINQ到实体排序的输入。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆