IPagedList <tentity> OrderBy </tentity>

时间:2014-03-03 13:08:31

标签: asp.net-mvc entity-framework ef-code-first pagedlist

我想创建一个通用存储库,并且有一个返回IPagedList的方法,如下所示:

    public IPagedList<TEntity> GetPage(int? page, int? size)
    {
        IQueryable<TEntity> query = _dbSet; // DbSet<TEntity> _dbSet;
        return query.ToPagedList(page ?? 1, size ?? 10);
    }

但是,IPagedList需要添加OrderBy(),否则会抛出以下消息:

  

方法'Skip'仅支持LINQ to中的排序输入   实体。必须在方法之前调用方法'OrderBy'   '跳过'。

我如何实现这一目标,如何为TEntity类型添加订购? 我可以让方法返回IQueryable并在控制器/调用者上进行分页并且它可以工作,但是想在通用存储库上执行此操作。

1 个答案:

答案 0 :(得分:1)

在实现抽象基类或接口时使TEntity更具体,然后更新方法签名以反映这一点。

为了说明我有一个名为Blog的模式类,它实现了接口IEntity

public interface IEntity
{
    Int32 Id { get; set; }
}
public class Blog : IEntity
{
    public int Id { get; set; }
    public String Name { get; set; }
}

然后您可以像这样更新您的Method签名:

public IPagedList<TEntity> GetPage<TEntity>(int? page, int? size) where TEntity : IEntity
{
    IQueryable<TEntity> query = _dbSet; // DbSet<TEntity> _dbSet;
    return query.OrderBy(x => x.Id).ToPagedList(page ?? 1, size ?? 10);
}

或者,您可以使用此处的Dynamic Linq OrderBy方便的扩展方法。

然后您可以将方法签名更新为

public IPagedList<TEntity> GetPage<TEntity>(int? page, int? size, string orderBy) where TEntity : IEntity
{
    IQueryable<TEntity> query = _dbSet; // DbSet<TEntity> _dbSet;
    return query.OrderBy(orderBy).ToPagedList(page ?? 1, size ?? 10);
}

您可以轻松地将其扩展为考虑排序方向