将 dapper 与 .net 核心一起使用时,对象必须实现 IConvertible 异常

Object must implement IConvertible Exception, when using dapper with .net core

我在我的项目中使用 asp net core,并将 dapper ORM 和 Postgresql 作为数据库。我想检查数据库中是否存在具有特定 UUID(C# 中的 GUID)值的用户。以下是我检查相同内容的代码:

public async Task<bool> DoesRecordExistAsync(Guid columnValue)
{

    bool doesRecordExist;

    doesRecordExist = await _connection.ExecuteScalarAsync<bool>("SELECT * FROM employee_master WHERE employee_id = @columnValue;", new { columnValue });

    return doesRecordExist;
}

注意:_connection是IDbconnection实例。

执行语句时,出现以下错误:

Object must implement IConvertible.

上面的代码有没有问题

尝试使用下一个查询:

SELECT EXISTS(SELECT 1 FROM employee_master WHERE employee_id = @columnValue)

您的查询“SELECT * FROM ....”return匹配数据库中的;不是您期望的 boolExecuteScalar 将 return 第一行的第一列。不能保证 that 列始终是布尔值;基本上,您也不期望该列的值。

查询应该类似于 select exists(select 1 from...,如 here 所述。
它将 return true/false 然后你可以用 await _connection.ExecuteScalarAsync<bool>(.......
处理 因此,新代码变为:

bool exists = await _connection.ExecuteScalarAsync<bool>("select exists(select 1 from....);
return exists;

或者(;不推荐),您应该将查询更改为 SELECT COUNT(*) FROM ... 以获取记录数。阅读有关优化的更多信息 here
然后你可以将它转换为 bool 如下所示:

int count = await _connection.ExecuteScalarAsync<int>("SELECT COUNT(*) FROM..........);
bool exists = count == 0 ? false : true;
return exists;