Ответ 1
В настоящее время только два способа, которыми я знаю, чтобы обойти это, -
- Создайте класс POCO с нужными вами полями и используйте свой запрос, например таблицу
- Измените исходный код Dapper, чтобы разрешить больше сопоставлений.
Итак, у меня есть ситуация, когда мне нужно объединить (и отобразить) более 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?
В настоящее время только два способа, которыми я знаю, чтобы обойти это, -
С сентября 2014 года существует объединенный PR на эту тему:
https://github.com/StackExchange/Dapper/pull/158/files
PR добавляет методы, в которых вы можете передать массив типов. Таким образом, ограничение на 7 объектов больше не существует для этих методов.
Это тест кода из репозитория Dapper, показывающий, как использовать один из этих новых методов:
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");
}