J'ai cette méthode:
public static IEnumerable<T> GetList(string where, Dictionary<string, object> parameters)
{
IEnumerable<T> entities;
using (var connection = OpenConnection())
{
entities = connection.GetList<T>(where, new DynamicParameters(parameters));
}
return entities;
}
Et je l'appelle comme ça:
string publicID = "463EC1EE-8AAB-4ABA-9B39-132BC8D3236E"
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("@APIPublicID", publicID);
var apiUsers = Repository<APIUsers>.GetList("WHERE APIPublicID = @APIPublicID", parameters).ToList();
La méthode GetList()
appelle le fichier .dll SIMPLECrud qui est un wrapper sur Dapper.
Cela fonctionne à merveille. Mais voici la chose vraiment étrange. Si j'ajoute des lettres ou des chiffres supplémentaires à la fin du guide publicID
, cela marche toujours:
Au lieu de:
string publicID = "463EC1EE-8AAB-4ABA-9B39-132BC8D3236E"
Je fais...
string publicID = "463EC1EE-8AAB-4ABA-9B39-132BC8D3236EABCDEFG"
.... // rest of the method as before
Je reçois exactement les mêmes résultats. Si je rends le guid plus court ou si je change de caractère à l’intérieur de celui-ci, il se comporte comme prévu.
Que fais-je mal ici?
Je pense que ce n'est pas lié à Dapper ou à SIMPLECrud mais à la manière dont SQL Server convertit les chaînes en uniqueidentifier
. Je suppose que vous utilisez SQL Server, mais sinon, votre base de données se comporte probablement de la même manière.
Lors de la uniqueidentifier
de chaîne en uniqueidentifier
, le serveur SQL ignorera simplement les caractères exsessifs:
select cast('463EC1EE-8AAB-4ABA-9B39-132BC8D3236EABCDEFG' as uniqueidentifier)
-- no errors, returns 463EC1EE-8AAB-4ABA-9B39-132BC8D3236E
Cela signifie que si la colonne APIPublicID
de votre exemple est de type uniqueidentifier
, les requêtes suivantes se comporteront de la même manière:
select * from MyTable WHERE APIPublicID = '463EC1EE-8AAB-4ABA-9B39-132BC8D3236E'
select * from MyTable WHERE APIPublicID = '463EC1EE-8AAB-4ABA-9B39-132BC8D3236EABCDEFG'
Parce que pour comparer, ils doivent être du même type, donc votre chaîne est convertie en uniqueidentifier
, en ignorant la partie excessive ( ABCDEFG
).