【问题标题】:SqlException error when trying to implement pagination in .net core web api尝试在.net core web api中实现分页时出现SqlException错误
【发布时间】:2020-09-01 09:40:11
【问题描述】:

我有这两段代码来实现分页。

第一个类如下:

public class QueryParameters
{
    const int _maxSize = 100;
    private int _size = 50;

    public int Page { get; set; }

    public int Size 
    {  
        get { return _size; }
        set { _size = Math.Min(_maxSize, value); }
    }
}

第二个是我的HttpGet代码:

    private readonly NSContext _context;

    public UsersController(NSContext context)
    {
        _context = context;
    }

    [HttpGet]
    public async Task<IActionResult> GetAllUSers([FromQuery] QueryParameters queryParameters)
    {
        IQueryable<User> users = _context.User;
        users = users
            .Skip(queryParameters.Size * (queryParameters.Page - 1))
            .Take(queryParameters.Size);
        return Ok(await users.ToArrayAsync());
    }

但是当我运行程序时,我得到了这个错误:

【问题讨论】:

  • 尝试为 Page 属性赋予 [Range(1, int.MaxValue)] 属性以进行客户端验证,或手动调整 if Page is 0 then set Page = 1 以获取服务器端容差。
  • 猜猜:你的前端使用 0 来表示第一页。当queryParameters.Page 为 0 时会发生什么?您减去 1,参数变为负数。它直接用作OFFSET 的参数,然后是错误。如果是这种情况,请将您的前端更改为使用 1 或检查 QueryParameters 中的默认值(以防前端发出没有值的请求)或不要减去 1。
  • 调试并验证“queryParameters.Page”没有变为零。但是,一般来说,您的代码应确保“queryParameters.Page”不会变为零,因为这会导致“-queryParameters.Size”
  • 您需要绝对确定 .Skip() 的值永远不会是负数;现在,使用.Skip(queryParameters.Size * (queryParameters.Page - 1)) - 如果您的Page 值为0,那么您会得到-queryParameters.Size 的结果,这是不允许的......
  • 你是对的。从此命令 (queryParameters.Page -1) 中删除 -1,问题就解决了。非常感谢

标签: c# asp.net-core pagination entity-framework-core


【解决方案1】:

我想问题是您试图跳过负 50 (-50) 行 那就是, QueryParameters 类中的 PAGE 变量为 0,因为你没有在任何地方初始化它

所以这个说法

 Skip(queryParameters.Size * (queryParameters.Page - 1))

说 Skip(50 * (0 - 1)) 即 Skip (-50)

这就是错误的原因。

你可以给一个默认值

如果您使用的是 C# 6,您可以这样做:

public int Page { get; set; } = 1

private int _Page = 1;
public int Page
{
   get
   {
      return _Page;
   }
   set
   {
      _Page = value;
   }
}

希望能解决你的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多