【问题标题】:IPagedList<TEntity> OrderByIPagedList<TEntity> OrderBy
【发布时间】:2014-04-04 13:18:35
【问题描述】:

我想创建一个通用存储库,并有一个返回 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 并在控制器/调用者上进行分页,它可以工作,但想在通用存储库上执行此操作。

【问题讨论】:

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


    【解决方案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);
    }
    

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

    【讨论】:

    • 它应该在这种情况下工作。但是,在我的情况下,更改域模型不是一种选择,并且主键的名称不同。
    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2011-10-31
    相关资源
    最近更新 更多