跳过并且不使用MySQL EntityFrameworkCore

我试图从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  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)没有运气。 有人遇到过这个问题或知道解决方法吗?

原来这是Oracle提供的MySql.Data EF连接器中的一个错误,错误详细信息发布在这里 。

替代方案:

我改为另一个名为Pomelo的连接器,现在SkipTake工作得非常好。 您可以搜索nuget for Pomelo.EntityFrameworkCore.MySql并为您的项目安装适当的版本。

要使用,只需在配置.UseMySql时将DbContext更改为.UseMySql ,因为oracle连接器使用SQLDbContext使用Sql只有套管不同。

 services.AddDbContext(options => options.UseMySql(Configuration.GetConnectionString("DefaultConnection"))); 

好吧,我知道答案是旧的……但是……在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