我有这种方法:
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;
}
我这样称呼它:
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();
GetList()
方法调用SIMPLECrud .dll,它是Dapper的包装器。效果很好。但是,这确实是很奇怪的事情。如果我在guid
publicID
的末尾添加一些额外的字母或数字,它将仍然有效:代替:
string publicID = "463EC1EE-8AAB-4ABA-9B39-132BC8D3236E"
我做...
string publicID = "463EC1EE-8AAB-4ABA-9B39-132BC8D3236EABCDEFG"
.... // rest of the method as before
我得到完全相同的结果。如果我使guid更短,或者更改了其中的字符,则它的行为将与预期的一样。
我在这里做错了什么?
最佳答案
我认为这与dapper或SIMPLECrud无关,而是SQL Server如何将字符串转换为uniqueidentifier
。我假设您使用的是SQL Server,但如果没有使用,则数据库的行为可能类似。
当将字符串强制转换为uniqueidentifier
时,SQL Server只会忽略存在的字符:
select cast('463EC1EE-8AAB-4ABA-9B39-132BC8D3236EABCDEFG' as uniqueidentifier)
-- no errors, returns 463EC1EE-8AAB-4ABA-9B39-132BC8D3236E
这意味着,如果示例中的
APIPublicID
列的类型为uniqueidentifier
,则以下查询的行为将相同:select * from MyTable WHERE APIPublicID = '463EC1EE-8AAB-4ABA-9B39-132BC8D3236E'
select * from MyTable WHERE APIPublicID = '463EC1EE-8AAB-4ABA-9B39-132BC8D3236EABCDEFG'
因为要进行比较,它们必须具有相同的类型,所以您的字符串将转换为
uniqueidentifier
,而忽略了多余的部分(ABCDEFG
)。关于c# - Dapper w/SIMPLECrud:GetList的行为类似于LIKE,而不是=,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49244395/