我正在尝试从MySQL数据库中分页Products
,但如果我使用Skip()
或Take()
,它会返回一个空的Json数组作为我的web api响应
[]
但是FirstOrDefault()
,Where()
等扩展方法可行。这是代码段:
public IActionResult GetPage(int page, int pageSize = 2)
{
int productCount = _context.Products.Count(); // 5
float totalPages = (float)Math.Ceiling((float)productCount / pageSize); //2.5 -- round to 3
if (page < 1 || page > totalPages) return NotFound();
var products = _context.Products.Skip((page - 1) * pageSize).Take(pageSize); //skip & take err mysql ef
return Ok(products);
}
我甚至硬编码查询.Skip(1).Take(2)
没有运气。有人遇到过这个问题或者知道解决方法吗?
答案 0 :(得分:7)
原来是Oracle提供的MySql.Data
EF连接器中的错误,错误详情已发布here。
替代解决方案:
我更改为另一个名为Pomelo的连接器,现在Skip
和Take
完全正常。您可以搜索nuget Pomelo.EntityFrameworkCore.MySql
并为您的项目安装适当的版本。
要使用,只需在配置.UseMySQL
时将.UseMySql
更改为DbContext
,因为oracle连接器使用SQL
和pomelo使用Sql
只有套管不同。< / p>
services.AddDbContext<ApplicationDbContext>(options =>
options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
答案 1 :(得分:0)
嗯,我知道答案是Old ...但是......在EF mysql中你需要在跳过之前通过desc传递一个命令或者命令。
真正的解决方案,而不是替代方案:
像这样:var yourVar = dbContext.LinkText
.Where(x => x.active)
.OrderByDescending(x => x.startDate)
.Skip(50)
.Take(10);
您可以在跳过时使用任何逻辑,并按照以下方式使用:
query
.OrderByDescending(x => x.startDate)
.Skip(page <= 1 ? 0 : (page - 1) * (qty == 0 ? 10 : qty))
.Take(qty == 0 ? 10 : qty);
然后mySQL将收到代码:
*...the query...*
ORDER BY `Extent1`.`startDate` DESC
LIMIT 0,10