Je suis nouveau sur Dapper, donc il se peut que je manque quelque chose d'évident, mais je ne comprends pas pourquoi cette requête renvoie null
même si l'enregistrement existe dans la table.
queryResult = db.Query<dynamic>(@"SELECT Id FROM Customer WHERE CustomerId = @CustomerId",
new { CustomerId = theCustomerId }).FirstOrDefault();
Je vérifie pour voir si l'enregistrement existe et dans ce cas, il le fait, mais queryResult est toujours null
. Le paramètre @CustomerId
est une string
que je correspond exactement.
Si j'exécute le SQL dans SQL Server, cela ne pose aucun problème ...
SELECT Id FROM Customer WHERE CustomerId = 'abc123'
où abc123
est le CustomerId
Il retourne null comme vous le souhaitez
Voici votre requête pour être exécuté, dans le cadre de l'API Query
"SELECT Id FROM Customer WHERE CustomerId = @CustomerId",
new { CustomerId = theCustomerId }
Maintenant, que se passe-t-il lorsque CustomerId
ne correspond pas, cela produit un IEnumerable<dynamic>
vide, bien que ce soit une histoire différente, pourquoi dynamic
, vous devez utiliser un integer
supposant que Id
est un entier
mais ce que FirstOrDefault()
fait en trouvant un IEnumerable
vide, retourne null
, donc il suffit de le supprimer, vérifiez comme Any
, dapper par défaut ne retourne pas null
, votre code le force
La meilleure façon de vérifier l'existence en utilisant dapper serait:
string sql = "SELECT count(1) FROM Customer WHERE CustomerId = @CustomerId;";
bool exists = false;
using (var connection = new SqlConnection("connection string"))
{
connection.Open();
exists = connection.ExecuteScalar<bool>(sql, new { CustomerId = "abc123" });
}
Pour ce qui est de savoir pourquoi votre exemple spécifique renvoie null, je suppose que c'est parce que vous aviez besoin de crochets autour de la db.Query
comme:
queryResult = (db.Query<dynamic>(@"SELECT Id FROM Customer WHERE CustomerId = @CustomerId",
new { CustomerId = theCustomerId })).FirstOrDefault();