【问题标题】:How to page thru sqlkata PaginationResult?如何通过 sqlkata PaginationResult 进行分页?
【发布时间】:2022-01-14 06:40:28
【问题描述】:

我正在使用 .NET Core 和 SQLKata 来访问 SQL Server 数据库。 我有一种方法可以使用 SQLKata.Execution.PaginationResult 从数据库中获取所有记录。

这是在存储库中:

public class MyTableRepository : IMyTableRepository
{
   private QueryFactory _db;
   public MyTableRepository(IConfiguration configuration)
   {
     var conn = new 
     SqlConnection(configuration.GetConnectionString("MyTable"));
     _db = new QueryFactory(conn, new SqlKata.Compilers.SqlServerCompiler());
   }

  public PaginationResult<MyModel> GetAll(int page = 0, int perPage = 25)
  {
    dbResult = _db.Query("MyTable").Paginate<MyModel>(page, perPage);
    return dbResult; 
  }

上面是从我的控制器中调用的,如下所示:

    private readonly IMyTableRepository _MyTableRepository;
    public MyTableController(IMyTableRepository MyTableRepository)
    {
        _MyTableRepository = MyTableRepository;
    }
    [HttpGet]
    [Route("GetMyTable")]
    public List<MyModel> GetMyTable()
    {
        PaginationResult<MyModel> dbResult = MyTableRepository.GetAll(1, 
        25);
        List<MyModel> AccumResult = dbResult.List.ToList();
        while(dbResult.HasNext)    
        {       
            dbResult = dbResult.Next();
            AccumResult.AddRange(dbResult.List.ToList());
        }
        return AccumResult;  
    }

如何从 dbResult 获取下一组结果?

我试了下,执行GetMyTable后,执行GetNextMyTable,但是在PaginationResult GetNext()中,dbResult总是为null。

在控制器中:

    [HttpGet]
    [Route("GetNextMyTable")]
    public List<MyTable> GetNextMyTable()
    {
        var result = _MyTableRepository.GetNext().List;
        return result.ToList();
    }

在存储库中:

public PaginationResult<MyTable> GetNext()
{
  while(dbResult.HasNext)    //--->> dbResult is null
  {       
   dbResult = dbResult.Next();
   return dbResult; 
  }      
  return null;
}    

如果我在 Controller 中执行 Next 方法,我也会收到错误

private readonly IMyTableRepository _MyTableRepository;
private PaginationResult<SP_SMA_Reporting_Accts> dbResult;

[HttpGet]
[Route("GetMyTable")]
public List<MyModel> GetMyTable()
{
    var dbResult = _MyTableRepository.GetAll(1, 25).List;
    return dbResult.ToList();
}

[HttpGet]
[Route("GetNextMyTable")]
public List<MyTable> GetNextMyTable()
{
    var result = dbResult.Next().List;//->Error since dbResult is null
    return result.ToList();
}

【问题讨论】:

  • 为什么不直接在GetAll()内部返回db.Query(...).Paginate(page, perPage),然后使用result.Next()方法
  • 您的意思是在 GetAll() 中也执行 result.Next() 吗? dbResult = _db.Paginate(new Query("MyTable"), page, perPage); dbResult.Next();返回 dbResult;
  • 不,只需返回 PaginationResult 并在控制器中使用 Next() 方法
  • 在我的控制器中,在 GetNextSP_SMA_Reporting_Accts() 中,当我执行 var result = Result.Next().List;结果也是空的,所以我也得到一个错误。我用这段代码更新了我的原始帖子

标签: c# .net-core pagination sqlkata


【解决方案1】:

简而言之,重构您的存储库方法GetAll 以调用db.Query

使用:

_db.Query("MyTable").Paginate<MyModel>(page, perPage);

而不是

_db.Paginate<MyModel>(new Query("MyTable"), page, perPage);

说明:
当调用 Next() 方法时,PaginationResult 将分页过程委托给持有查询,在您的情况下,由于您正在传递 new Query() 因此没有连接信息,因此您将获得空值。

【讨论】:

  • 我在原始帖子的控制器中编辑了 GetMyTable()。因此,GetMyTable() 将返回 List AccumResult 中表中的所有记录。这是你的意思吗?如果我只想在 List 中一次返回 25 条记录(这是每页的分页),怎么样?而且,当调用应用程序调用 GetNext() 时,它将返回接下来的 25 条记录(.Next() 函数)。这可能吗?
猜你喜欢
  • 2015-03-10
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多