【问题标题】:How to handle paging IQueryable with Linq To Entities? (problem with OrderBy)如何使用 Linq To Entities 处理分页 IQueryable? (OrderBy 的问题)
【发布时间】:2010-12-04 00:02:06
【问题描述】:

我目前正在使用 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”之前调用方法“OrderBy”。

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

谢谢!

【问题讨论】:

    标签: entity-framework generics iqueryable


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您发布有关 PagedList 的帖子(最好不要重新发明轮子)。
    【解决方案2】:

    您可以将构造函数的签名更改为需要IOrderedQueryable&lt;T&gt; 参数,而不是IQueryable&lt;T&gt;。然后调用代码将负责处理排序。

    public PaginatedList(IOrderedQueryable<T> source, int pageIndex, int pageSize)
    

    【讨论】:

      【解决方案3】:

      我认为你最好的选择是确保你的查询在传递给PaginatedList之前有一个顺序。

      【讨论】:

        【解决方案4】:

        您总是可以在方法中添加另一个参数以允许调用者定义 OrderBy 子句:

        public PaginatedList(IQueryable<T> source, Func<T, TKey> orderBy, 
            int pageIndex, int pageSize)
        {
            // your other code here
            this.AddRange(source.OrderBy(orderBy)
                .Skip(pageIndex * pageSize)
                .Take(pageSize));
        }
        

        【讨论】:

        • 我试过你的答案,但我得到了The type or namespace name 'TKey' could not be found (are you missing a using directive or an assembly reference?) 错误
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        相关资源
        最近更新 更多