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)。