18

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

我之前修改了代码以支持最多 6 个用于另一个查询,但现在我真的认为我不应该再破解 6 个级别的泛型。

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

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

4

3 回答 3

30

在我从事的一个项目中,我看到类似这样的东西可以映射超过 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"
);

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

于 2015-06-25T10:18:35.060 回答
4

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

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....));

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

有一个取自精致时代的例子:

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();
   ...
} 
于 2012-04-18T05:29:08.080 回答
2

很久以前就已经回答了,但我想在这里加两分钱。与其手动修改 Dapper 的源代码,不如直接用这些字段创建一个 poco 类,然后像使用表格一样使用查询?

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

于 2013-06-10T17:58:01.687 回答