如何使用Linq To Entities处理分页IQueryable? (OrderBy的问题)

entity-framework generics iqueryable

我目前正在使用Linq to Entities构建一个简单的ASP.NET MVC站点。我第一次涉足这个世界是书呆子晚餐,我在那里找到了我试图使用的分页列表代码。代码如下:

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

        this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
    }

    public bool HasPreviousPage
    {
        get
        {
            return (PageIndex > 0);
        }
    }

    public bool HasNextPage
    {
        get
        {
            return (PageIndex + 1 < TotalPages);
        }
    }
}

问题是我正在使用实体框架,上面的代码抛出以下错误:

只有LINQ to Entities中的排序输入才支持'Skip'方法。必须在方法'Skip'之前调用'OrderBy'方法。

不知道Linq的来龙去脉,当我不知道上面方法中的列名是什么时,我不知道如何添加orderby子句,它是通用的。

谢谢!

一般承认的答案

我认为你最好的选择是在将查询传递给PaginatedList 之前确保你的查询有订单。


热门答案

首先,我强烈建议使用免费的PagedList代码而不是编写自己的代码,因为它考虑了许多你最终必须自己发现的东西,并且几乎没有缺点。

要回答您的问题,您应该在将列表传递给分页功能之前对其进行排序。如果需要动态执行此操作,可以使用Microsoft DynamicQuery库。但通常,调用代码将知道如何对列表进行排序。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因