2014-03-03 44 views
0

我想創建一個通用的存儲庫,並有一個返回值IPagedList類似下面的方法:IPagedList <TEntity>排序依據

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

然而,IPagedList需要添加一個排序依據()或它拋出以下信息:

「Skip」方法僅支持LINQ到 實體中的排序輸入。必須在方法 「跳過」之前調用方法'OrderBy'。

我該如何做到這一點,我如何添加TEntity類型的排序? 我可以讓方法返回IQueryable並在控制器/調用方上進行分頁,它可以工作,但是想在通用資源庫上執行此操作。

回答

1

使您的TEntity更具體,因爲在實現抽象基類或接口時,然後更新您的方法簽名以反映此情況。

爲了說明我有一個模式類稱爲博客,它實現接口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); 
} 

您可以輕鬆地擴展這個也採取排序方向考慮

+0

應該在這種情況下工作。但是,在我的情況下,更改域模型不是一種選擇,主鍵的命名也不一樣。 – Mentor

+0

@MiNT看到更新的答案 – Drauka