Dans Dapper, quelle est la différence entre l'utilisation de QueryFirstOrDefault<T>
et ExecuteScalar<T>
?
Les deux semblent renvoyer une seule valeur, bien que QueryFirstOrDefault<T>
renvoie une valeur par défaut pour le type, si aucune n'est trouvée. Devez-vous toujours préférer l'utilisation de l'un des deux, pour des raisons de performances ou pour d'autres raisons, ou sont-ils équivalents, sans tenir compte de la valeur par défaut renvoyée?
La principale différence est à leur retour:
ExecuteScalar<T>
, comme l'ont dit d'autres utilisateurs, ne renvoie que la première cellule du jeu de résultats.
ExecuteScalar<T>
est générique <T>
, et il convertit automatiquement le résultat dans le type que vous avez spécifié sur <T>
QueryFirstOrDefault<T>
exécute une requête et renvoie le type de données que vous avez spécifié sur <T>
:
Si le type spécifié est un type de base (chaîne, int, etc ...) il ne renvoie que les données de la première colonne.
Si le type spécifié est un objet, alors pour chaque ligne du jeu de résultats, une instance de cet objet est créée. Soyez conscient du fait qu'un mappage direct nom-colonne === nom-membre est supposé et qu'aucun mappeur personnalisé ne peut être utilisé, donc si votre objet a des noms de champ différents de ceux des colonnes de l'ensemble de résultats, aucune valeur ne sera extraite.
Scalar s'attend à ce qu'une seule ligne soit renvoyée par le script SQL; QueryFirstOrDefault ne se soucie pas du nombre de lignes renvoyées.
Je pense (ne peux pas vérifier cela pour le moment) que Scalar pourrait générer une erreur si zéro ligne est retournée (merci @Tim de me corriger sur plusieurs résultats).
Je dirais que la préférence dépend de ce que le script que vous avez écrit devrait faire.