什么可能导致这个问题?
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);
}
}
}
}
有什么建议?
似乎错误正是它所说的。 “仅允许在分类输入上跳过”。正在搜索此错误,I've found this。
如果在Skip之前包含OrderBy,则应该修复它:
source.orderBy(???).Skip(PageIndex * PageSize).Take(PageSize));
由于传递通用对象T,因此可能存在问题。您可能需要扩展类以接收另一个参数以按元素指示顺序。
工作(使用第一个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);
}
我想通过运行类似于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语句!
IQueryable
没有订单,所以说“忽略下一个x元素”没有任何意义。
如果你包括一个order by
子句(或者可能是一个AsEnumerable()
调用 - 未经测试),那么你的数据需要一个订单,而Skip
和Take
现在是明智的。