如何使用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庫。但通常,調用代碼將知道如何對列表進行排序。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因