可能导致此问题的原因是什么?
public ActionResult Index(int page = 0)
{
const int pageSize = 3;
var areas = repo.FindAllAreas();
var paginatedArea = new PaginatedList<Area>(areas, page, pageSize);
return View(paginatedArea);
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UTEPSA.Controllers
{
class PaginatedList<T> : List<T>
{
public int PageIndex { get; private set; }
public int PageSize { get; private set; }
public int TotalCount { get; private set; }
public int TotalPages { get; private set; }
public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize)
{
PageIndex = pageIndex;
PageSize = pageSize;
TotalCount = source.Count();
TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);
//ERROR HERE->>this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
}
public bool HasPreviousPage
{
get
{
return (PageIndex > 0);
}
}
public bool HasNextPage
{
get
{
return (PageIndex + 1 < TotalPages);
}
}
}
}
有什么建议吗?
答案 0 :(得分:24)
似乎错误正是它所说的。 “仅允许在分类输入上跳过”。正在搜索此错误I've found this。
如果您在跳过前包含OrderBy,则应该修复:
source.orderBy(???).Skip(PageIndex * PageSize).Take(PageSize));
由于您传递的是通用对象T,因此可能会出现问题。您可能需要扩展您的类以接收另一个参数来按元素指示顺序。
答案 1 :(得分:3)
有效(使用第一个IOrderedQueryable):
http://msdn.microsoft.com/en-us/library/bb738702.aspx
IOrderedQueryable<Product> products = context.Products
.OrderBy(p => p.ListPrice);
IQueryable<Product> allButFirst3Products = products.Skip(3);
Console.WriteLine("All but first 3 products:");
foreach (Product product in allButFirst3Products)
{
Console.WriteLine("Name: {0} \t ID: {1}",
product.Name,
product.ProductID);
}
答案 2 :(得分:2)
我想通过运行类似LINQ skip / take查询的SQL来验证这一点。
SELECT * FROM [table]
--order by [column] //omitted!
OFFSET 10 ROWS
FETCH NEXT 15 rows only
请注意,当省略order-by子句时,SQL错误提供的信息要少得多:
"Invalid usage of the option NEXT in the FETCH statement."
因此,实际上在数据库级别上需要“已排序的输入”。感谢LINQ帮助开发人员编写高级SQL语句!
答案 3 :(得分:1)
IQueryable
没有订单,所以说“忽略下一个 x 元素”没有任何意义。
如果您添加order by
子句(或可能是AsEnumerable()
来电 - 未经测试),那么您的数据会收到订单Skip
和{{1}现在是明智的。