SqlMapper.Query<T>
似乎忽略了我已注册的TypeHandler<T>
这是一个简单的查询:
SELECT 'Foo' AS CategoryName, 200 AS CategoryRating
......以及这两个POCO:
public class RatingValue
{
public Int32 Value { get; set; }
// ... some other properties etc ...
}
public class MyResult
{
public String CategoryName { get; set; }
public RatingValue CategoryRating { get; set; }
}
我已经创建了一个新的TypeHandler
实现,应该将CategoryRating Int32
转换为RatingValue
对象:
public class RatingValueHandler: SqlMapper.TypeHandler<RatingValue>
{
public override RatingValue Parse(object value)
{
if (value is Int32)
return new RatingValue() { Value = (Int32)value };
throw new FormatException("Invalid conversion to RatingValue");
}
public override void SetValue(System.Data.IDbDataParameter parameter, RatingValue value)
{
// ... null, range checks etc ...
parameter.DbType = System.Data.DbType.Int32;
parameter.Value = Int32.Parse(value.Value);
}
}
现在,在运行我的查询之前,我添加了这样的新处理程序:
SqlMapper.AddTypeHandler<RatingValue>(new RatingValueHandler());
但是,当我运行时:
c.Query<MyResult>("SELECT 'Foo' AS CategoryName, 200 AS CategoryRating");
我从Dapper得到一个例外 - 它无法解析第1列中的结果。 我期待 Dapper解雇我的自定义类型处理程序!
我想我错过了非常非常明显的事情。请告诉我我多么愚蠢!
答案 0 :(得分:5)
你不是很傻;是我;以下现在在本地传递(推送到github); 将在v1.27及更高版本中很快部署到NuGet now available on NuGet:
public void SO24740733_TestCustomValueHandler()
{
Dapper.SqlMapper.AddTypeHandler(RatingValueHandler.Default);
var foo = connection.Query<MyResult>(
"SELECT 'Foo' AS CategoryName, 200 AS CategoryRating").Single();
foo.CategoryName.IsEqualTo("Foo");
foo.CategoryRating.Value.IsEqualTo(200);
}
public void SO24740733_TestCustomValueSingleColumn()
{
Dapper.SqlMapper.AddTypeHandler(RatingValueHandler.Default);
var foo = connection.Query<RatingValue>(
"SELECT 200 AS CategoryRating").Single();
foo.Value.IsEqualTo(200);
}