跳过并且不使用MySQL EntityFrameworkCore

时间:2017-01-15 00:33:09

标签: c# mysql entity-framework-core

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

2 个答案:

答案 0 :(得分:7)

原来是Oracle提供的MySql.Data EF连接器中的错误,错误详情已发布here

替代解决方案:

我更改为另一个名为Pomelo的连接器,现在SkipTake完全正常。您可以搜索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