Dapper w/ SIMPLECrud:GetList with WHERE 表现得像 LIKE 而不是 =
Dapper w/ SIMPLECrud: GetList with WHERE behaving like LIKE instead of =
我有这个方法:
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 服务器如何将字符串转换为 uniqueidentifier
。我假设您使用 SQL 服务器,但如果没有 - 可能您的数据库以类似的方式运行。
将字符串转换为 uniqueidentifier
时,SQL 服务器将忽略过多的字符:
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
)。
我有这个方法:
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 服务器如何将字符串转换为 uniqueidentifier
。我假设您使用 SQL 服务器,但如果没有 - 可能您的数据库以类似的方式运行。
将字符串转换为 uniqueidentifier
时,SQL 服务器将忽略过多的字符:
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
)。