使用 Dapper 映射 5 种以上的类型
本文关键字:类型 Dapper 映射 使用 | 更新日期: 2023-09-27 18:31:23
我目前正在构建一个将 12 个表连接在一起的 SELECT 查询。我一直在使用 Dapper 进行所有其他查询,效果很好。问题是,泛型方法只有五个泛型参数。
我之前修改了代码以支持最多 6 个查询,但现在我真的认为我不应该再破解 6 个级别的泛型。
有没有办法传递一个类型数组,它将结果作为对象数组返回,如果有必要,我可以手动强制转换?
我也可能以错误的方式处理问题!任何帮助将不胜感激!
在我参与的一个项目中,我看到了这样的东西,可以映射超过 7 种类型。我们使用了 Dapper 1.38:
connection.Query<TypeOfYourResult>
(
queryString,
new[]
{
typeof(TypeOfArgument1),
typeof(TypeOfArgument2),
...,
typeof(TypeOfArgumentN)
},
objects =>
{
TypeOfArgument1 arg1 = objects[0] as TypeOfArgument1;
TypeOfArgument2 arg2 = objects[1] as TypeOfArgument2;
...
TypeOfArgumentN argN = objects[N] as TypeOfArgumentN;
// do your processing here, e.g. arg1.SomeField = arg2, etc.
// also initialize your result
var result = new TypeOfYourResult(...)
return result;
},
parameters,
splitOn: "arg1_ID,arg2_ID, ... ,argN_ID"
);
查询字符串是不言自明的。splitOn 参数说明 Dapper 应如何从 SELECT 语句中拆分列,以便所有内容都可以正确映射到对象,你可以在这里阅读它。
您可以使用动态查询并在之后映射它。像这样的东西
var result = conn.Query<dynamic>(query).Select(x => new Tuple<Type1, Type2, Type3, Type4, Type5>(
// type initialization here
new Type1(x.Property1,x.Property2),
new Type2(x.Property3,x.Property4),
new Type3(x.Property5,x.Property6) etc....));
编辑:对于相当大的结果集,另一种选择可能是使用多个查询,然后使用网格读取器。这可能对你有用。
这是从dapper时代取来的例子:
var sql =
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";
using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
{
var customer = multi.Read<Customer>().Single();
var orders = multi.Read<Order>().ToList();
var returns = multi.Read<Return>().ToList();
...
}
这个问题很久以前就已经回答了,但我想在这里加上我的两分钱。与其手动修改 Dapper 的源代码,不如直接使用这些字段创建一个 poco 类,并像使用表一样使用查询呢?
映射可以正常工作,我知道做这个类定义也很痛苦,但似乎比处理后来的 Dapper 更新更容易。