跳过并且不使用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的连接器,现在Skip
和Take
工作得非常好。 您可以搜索nuget for Pomelo.EntityFrameworkCore.MySql
并为您的项目安装适当的版本。
要使用,只需在配置.UseMySql
时将DbContext
更改为.UseMySql
,因为oracle连接器使用SQL
和DbContext
使用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