只有LINQ to Entities中的排序输入才支持'Skip'方法

时间:2010-08-09 03:37:34

标签: c# linq-to-entities

可能导致此问题的原因是什么?

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);
            }
        }
    }
}

有什么建议吗?

4 个答案:

答案 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}现在是明智的。