0

我想创建一个通用存储库,并有一个返回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() 否则会抛出以下消息:

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

我怎样才能做到这一点,我怎样才能为 TEntity 类型添加排序?我可以让方法返回 IQueryable 并在控制器/调用者上进行分页,它可以工作,但想在通用存储库上执行此操作。

4

1 回答 1

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; }
}

然后你可以像这样更新你的方法签名:

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

您可以轻松扩展它以考虑排序方向

于 2014-03-06T22:31:44.770 回答