使用Dapper映射超过5种类型

我目前正在构建一个将12个表连接在一起的SELECT查询。 我一直在使用Dapper进行所有其他查询,效果很好。 问题是,generics方法只需要五个通用参数。

我以前修改过代码以支持最多6个用于另一个查询,但是现在我真的不认为我应该破解6个更多级别的generics。

有没有办法将dapper传递给一个类型数组,并将结果作为一个对象数组返回,如果必须的话我可以手动编译?

我也可能以错误的方式接近问题! 任何帮助将不胜感激!

在我工作的项目中,我看到这样的东西可以映射超过7种类型。 我们使用了Dapper 1.38:

connection.Query ( 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, eg arg1.SomeField = arg2, etc. // also initialize your result var result = new TypeOfYourResult(...) return result; }, parameters, splitOn: "arg1_ID,arg2_ID, ... ,argN_ID" ); 

queryString是不言自明的。 splitOn参数说明Dapper应如何从SELECT语句中拆分列,以便可以将所有内容正确映射到对象, 您可以在此处阅读 。

您可以使用动态查询并在之后映射它。 像这样的东西

 var result = conn.Query(query).Select(x => new Tuple( // type initialization here new Type1(x.Property1,x.Property2), new Type2(x.Property3,x.Property4), new Type3(x.Property5,x.Property6) etc....)); 

编辑:使用相当大的结果集,另一个选项可能是使用多个查询,然后使用网格阅读器。 这可能对你有用。

这个例子取自小巧玲珑的时代:

 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().Single(); var orders = multi.Read().ToList(); var returns = multi.Read().ToList(); ... } 

这已经很久以前得到了回答,但我想在这里补充两分钱。 而不是手动修改Dapper的源代码,为什么不用这些字段创建一个poco类并像表一样使用您的查询?

映射可以正常工作,我知道做类定义也很痛苦,但似乎比处理后来的Dapper更新更容易。