Dapper无限多重映射

18

所以我有一个情况,需要连接(和映射)超过7个实体(就我所知,这是Dapper的当前限制)。 以下是我的伪代码:

using (var connection = new SqlConnection(_connectionString)) {
   IEnumerable<BigEntity> results = 
      connection.Query<BigEntity, Lookup1, Lookup2, ... around 10 of them>(sql, 
         (b, l1, l2, l3) => {
            // map and return here
         },
         splitOn: "split1, split2 ...");
}

有没有绕过这个限制的方法?有人遇到过这个问题吗?也许可以使用一些 Dapper 扩展?


修改 Dapper 应该不难。 - talles
@talles,不,这并不难,你是对的。然而,我想要它正式化,而不是使用我自己修补过的Dapper版本。 - Dimitar Dimitrov
这个问题有任何更新吗?我们也遇到了同样的问题 :-( ~Hejo - user5957083
如果有帮助的话,我最终添加了一个新的(包装器)POCO,并将所有需要的字段映射到它。 - Dimitar Dimitrov
2个回答

16

有一个来自2014年9月的合并PR:

https://github.com/StackExchange/Dapper/pull/158/files

该PR添加了一些新方法,可以传递类型数组。因此,在这些方法中不再存在7个实体的限制。

以下是Dapper Repo的代码测试,展示如何使用其中一个新方法:

public async Task TestMultiMapArbitraryWithSplitAsync()
    {
        const string sql = @"select 1 as id, 'abc' as name, 2 as id, 'def' as name";
        var productQuery = await connection.QueryAsync<Product>(sql, new[] { typeof(Product), typeof(Category) }, (objects) => {
            var prod = (Product)objects[0];
            prod.Category = (Category)objects[1];
            return prod;
        });

        var product = productQuery.First();
        // assertions
        product.Id.IsEqualTo(1);
        product.Name.IsEqualTo("abc");
        product.Category.Id.IsEqualTo(2);
        product.Category.Name.IsEqualTo("def");
    }

6

目前我所知道的解决方法只有两种:

  • 创建一个 POCO 类,包含你想要的字段,并像使用表格一样使用你的查询
  • 修改 Dapper 的源代码以允许更多的映射。

我感谢你的回应 +1。然而,冒昧说一句话,这不算是一个很好的答案。我提问的原因就是为了避免修改 Dapper 或创建包装 POCO。谢谢。 - Dimitar Dimitrov
1
完全可以理解 :) 我应该先说明一下,我对此进行了大量研究,其他人也遇到了类似的问题,这是系统中的硬性限制,有人已经提交了拉取请求以请求这个确切的功能。当我需要它来满足某个需求时,我找不到任何类似于您所寻找的东西。抱歉。 - mosesfetters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接