跳過並且不使用MySQL EntityFrameworkCore

c# entity-framework-core mysql

我試圖從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)沒有運氣。有人遇到過這個問題或知道解決方法嗎?

一般承認的答案

原來這是Oracle提供的MySql.Data EF連接器中的一個錯誤,錯誤詳細信息發佈在這裡

替代方案:

我改為另一個名為Pomelo的連接器,現在SkipTake工作得非常好。您可以搜索nuget for Pomelo.EntityFrameworkCore.MySql並為您的項目安裝適當的版本。

使用時,只需改變.UseMySQL.UseMySql組態時DbContext ,以oracle連接器使用SQL和柚使用Sql只有殼體是不同的。

services.AddDbContext<ApplicationDbContext>(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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow