值不是可转换对象
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 假定您只会将其用于 int
、string
等简单类型
在你的情况下,使用:
var jc = this.dbConnection.Query<JcUser>(
sql, args).SingleOrDefault();
如果你想避免隐藏的 List<>
分配,你也可以传递 buffered: false
.
我有一个简单的查询和与 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 假定您只会将其用于 int
、string
等简单类型
在你的情况下,使用:
var jc = this.dbConnection.Query<JcUser>(
sql, args).SingleOrDefault();
如果你想避免隐藏的 List<>
分配,你也可以传递 buffered: false
.