Sto cercando di impaginare i Products
da MySQL db, ma se uso Skip()
o Take()
restituisce un array Json vuoto come risposta alla mia web api come questa
[]
Ma i metodi di estensione come FirstOrDefault()
, Where()
... funzionano bene. Ecco lo snippet di codice:
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);
}
Ho persino hardcoded la query .Skip(1).Take(2)
senza fortuna. Qualcuno ha affrontato questo problema o conosce una soluzione alternativa?
Si è rivelato un bug nel connettore EF MySql.Data
fornito da Oracle, i dettagli del bug sono pubblicati qui .
Soluzione alternativa:
Sono passato a un altro connettore chiamato Pomelo , ora Skip
and Take
funziona perfettamente. Puoi cercare nuget per Pomelo.EntityFrameworkCore.MySql
e installare la versione appropriata per il tuo progetto.
Per usare, cambia semplicemente .UseMySQL
in .UseMySql
quando configuri DbContext
, dato che il connettore oracle usa SQL
e pomelo usa Sql
solo l'involucro è diverso.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
Bene, ho capito che la risposta è vecchia ... ma ... in EF mysql è necessario passare un ordine o ordinare per desc prima del salto.
Soluzione reale, non alternativa:
come questo:
var yourVar = dbContext.LinkText
.Where(x => x.active)
.OrderByDescending(x => x.startDate)
.Skip(50)
.Take(10);
Puoi usare con qualsiasi logica su skip e prendi così:
query
.OrderByDescending(x => x.startDate)
.Skip(page <= 1 ? 0 : (page - 1) * (qty == 0 ? 10 : qty))
.Take(qty == 0 ? 10 : qty);
e quindi il mySQL riceverà il codice:
*...the query...*
ORDER BY `Extent1`.`startDate` DESC
LIMIT 0,10