我想创建一个通用存储库,并且有一个返回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并在控制器/调用者上进行分页并且它可以工作,但是想在通用存储库上执行此操作。
答案 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);
}
您可以轻松地将其扩展为考虑排序方向