我有这种方法:

    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/

10-17 01:55