2015-09-11 98 views
1

我正在使用dapper和dapper.contrib.My问题是如何创建通用分页类。 这是我到目前为止所尝试过的。通用分页与精简版

public class GenericRepository<T> :IGenericRepository<T> where T : class 
    { 
    public async Task<IEnumerable<T>> GetAllPagedAsync(int limit,int offset) 
     { 
      var list = await Connection.GetAllAsync<T>();//but this return IEnumarable 
      return list; 

     } 
} 

我在想什么的就是这是一样的表名类的T-名字,并写称为sql_statement SQL字符串是适用pagination.later使用这个代码。

var list = await Connection.QueryAsync<T>("sql_statement") 

这是否有意义?我有更好的方法来实现这一点。

回答

1

它目前看起来好像您打算检索表中行的所有,然后从中选择您实际需要的数据页面。从数据库中直接选择需要的页面可能会更快,除非您出于某种原因确实需要所有行。

假设你的表名是总是要完全匹配各自的类/实体名称,下面会给你一个分页结果(使用的是Postgres):

public class GenericRepository<T> : IGenericRepository<T> where T : class 
     { 
     public async Task<IEnumerable<T>> GetAllPagedAsync(int limit, int offset) 
      { 
       var tableName = typeof(T).Name;    
       // assuming here you want the newest rows first, and column name is "created_date" 
       // may also wish to specify the exact columns needed, rather than * 
       var query = "SELECT * FROM @TableName ORDER BY created_date DESC Limit @Limit Offset @Offset"; 
       var results = Connection.QueryAsync<T>(query, new {Limit = limit, Offset = offset}); 
       return results; 
      } 
    } 

对此的说明。我显然不熟悉数据库的结构或大小,但对于大多数通用目的而言,这里显示的用于分页的限制/偏移方法很可能就足够了。但是,您可能希望考虑一些潜在的问题:

  1. 当偏移值变得非常大时,性能可能会受到影响。
  2. 以这种方式插入频率高的分页表可能会导致结果在多个页面上出现/重复,因为偏移值没有考虑自上次检索以来添加到表中的新行。

无论这些是否可能会导致您的具体情况的问题,这些潜在的弊端,以及一些替代解决方案are outlined here