J'essaie de retourner les 1000 premières lignes d'un tableau, mais en utilisant EF Core, j'obtiens le jeu de données complet avant l'exécution de .Take(1000).
API
[HttpGet("MyThing/{id}")]
public List<MyObj> ItemsReport(long id)
{
response = new List<MyObj>();
response = _reporting.GetNewEntries(id);
return response;
}
Reporting
public virtual List<MyObj> GetNewEntries(long id)
{
var newEntries = new List<MyObj>();
var entries = _DbContext.ReportNewEntries
.OrderBy(a => long.Parse(a.Id))
.Where(a => long.Parse(a.Id) > id)
.Take(1000);
newEntries.AddRange(entries);
return newEntries;
}
DbContext
DbSet<MyObj> ReportNewEntries{ get; set; }
La demande que je souhaite formuler est à peu près la suivante :
SELECT TOP (1000) *
FROM dbo.ReportNewEntries
WHERE CONVERT(bigint, Id) > 0
ORDER BY CONVERT(bigint, Id)
Ma requête actuelle, selon le profileur SQL est :
SELECT * FROM dbo.ReportNewEntries
La table est monolithique, je veux donc accéder aux rangées 1000 à la fois. Avez-vous des suggestions sur l'erreur que je suis en train de commettre ?
0 votes
Le problème n'est pas clair, votre code ne renvoie déjà que 1000 lignes de la table.
0 votes
Essayé
var entries = _DbContext.ReportNewEntries.Take(1000).OrderBy(a => long.Parse(a.Id)).Where(a => long.Parse(a.Id) > id);
?0 votes
@AhmedYousif La question indique clairement que le problème n'est pas ce que le code renvoie, mais la requête qu'il exécute en dessous.
0 votes
Elle ne devrait pas l'être car l'instruction ne sera pas exécutée avant d'essayer de la résoudre ou d'appeler .ToList() stackoverflow.com/questions/2656576/
0 votes
@AhmedYousif - mais c'est le cas, j'ai lancé sql profiler, et c'est le cas.
0 votes
@bolkay cela fonctionne quelque peu, cependant, j'ai besoin d'obtenir les 1000 premiers après avoir obtenu le premier ensemble, par exemple, la ligne 1-1000 se charge, je rappelle 1001-2000 avec l'Id afin d'obtenir les 1000 suivants. Est-ce que cela a un sens ?
0 votes
@N00b au lieu de long.parse utiliser Convert.ToInt64 et réessayer