Est-ce que Dapper's IEnumerable avoir différé ou exécution immédiate?

c# dapper deferred-execution ienumerable orm

Question

Lorsque j'exécute une requête dans Dapper et que je souhaite uniquement récupérer un bloc d'enregistrements, puis-je utiliser .Skip (). Take (), ou dois-je utiliser select top n * dans le SQL?

Par exemple, compte tenu d'une table de 10 000 enregistrements et que je ne souhaite que les 200 premiers, car ma page de liste affiche uniquement 200 par page. Est-ce que je cours ça?

conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size);

Ou ca:

conn.Query<Widget>("select top 200 * from Widgets");

La méthode .Query<T> Dapper est- .Query<T> différée ou non?

Réponse acceptée

Vous devez utiliser SELECT TOP n...

La méthode Query<T> a un paramètre facultatif bool buffered = true qui, lorsqu’il est vrai, parcourt le jeu de résultats complet, en lisant chaque ligne dans une List<T> . Vous pourriez rendre ce paramètre faux et le résultat IEnumerable<T> serait "différé" en ce sens que la requête de base de données ne serait pas exécutée tant que vous ne l'utiliseriez pas et que les lignes seraient récupérées du côté de la base de données "une à la fois. "(appelle IDataReader.Read à chaque itération).

Donc, oui, il peut être "différé". Cependant, vous devez toujours utiliser TOP n car sinon, vous exécuteriez et prépareriez le jeu de résultats pour 10000 enregistrements du côté de la base de données, bien que vous ne puissiez transporter que les n premières lignes de ceux-ci vers le client.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi