2013-12-04 4 views
15

Итак, у меня есть ситуация, когда мне нужно объединить (и отобразить) более 7 объектов (что, насколько я вижу, является текущим ограничением Dapper). Это то, что у меня до сих пор (псевдо-код):Dapper unlimited multi-mapping

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?

+0

Изменение щеголеватого не должно быть жесткий – talles

+0

@talles, Нео, это не так трудно, ты правильно. Однако я бы хотел, чтобы он был официальным, и у меня не было собственной исправленной версии Dapper. –

+0

Любые обновления по этой проблеме? Мы сталкиваемся с одной и той же проблемой :-(~ Hejo – Christopher

ответ

5

В настоящее время только два пути, которые я знаю, чтобы работать вокруг этого является

  • Создать класс POCO с полями, которые вы хотите и использовать запрос как таблицу
  • исходный код ИЗМЕНЯЮТ щеголеватый, чтобы позволить для большего количества отображений.
+0

Я ценю ваш ответ +1. риск звучать как рывок, это не очень ответ. Вся причина, по которой я задаю вопрос, - это то, что мне не нужно * изменять * Dapper или создавать обертку POCO. Cheers. –

+1

Полностью понятно:) Я, вероятно, должен был предварять это и сказал, что я провел много исследований в этом, а у других были аналогичные проблемы, и его жесткий предел в системе, и люди сделали запросы на получение запроса, запрашивающие эту точную функцию. Я не мог найти ничего похожего на то, что вы ищете, когда мне нужно было это требование. Сожалею. – mosesfetters

2

Существует объединенный PR на эту тему с сентября 2014 года:

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

ПР добавил методы, где вы можете передать массив типов. Таким образом, ограничение на 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"); 
    } 
Смежные вопросы