值不是可转换对象

Value is not a convertible object

我有一个简单的查询和与 Dapper 一起使用的 Poco,如下所示:

var jc = this.dbConnection.ExecuteScalar<JcUser>("SELECT loginid as Username,Password,coalesce(CustomerId,0) as CustomerId,TextProfileId,UxProfileId from \"user\" where id = @id", new {id = id});

波科:

public class JcUser
{

    public string UserName { get; set; }

    public string Password { get; set; }

    public int CustomerId{ get; set; }

    public int TextProfileId { get; set; }

    public int UxProfileId { get; set; }
}

执行时会抛出异常并显示消息

Value is not a convertible object: System.String to JcUser

堆栈跟踪结束于:at System.Convert.ToType (System.Object value, System.Type conversionType, IFormatProvider provider, Boolean try_target_to_type)

知道为什么要这样做吗?

谢谢

UPDATE:使用 var jc = this.dbConnection.Query<JcUser>("SELECT loginid as Username,Password,coalesce(CustomerId,0) as CustomerId,TextProfileId,UxProfileId from \"user\" where id = @id", new {id = id}).First(); 似乎有效。我也意识到我是个白痴,而 ExecuteScalar 仅用于一个值。但是,我的更新是只检索一行的最佳方式吗?

ExecuteScalar 映射到同名的 ADO.NET 方法。它 returns 最多一个单元格:一个网格,一行,一列。因此,它不适用于复杂的对象,并且 不能 在您的情况下正常工作,因为您有多个列。

Dapper 假定您只会将其用于 intstring 等简单类型

在你的情况下,使用:

var jc = this.dbConnection.Query<JcUser>(
     sql, args).SingleOrDefault();

如果你想避免隐藏的 List<> 分配,你也可以传递 buffered: false.