Использование Dapper для отображения более 5 типов
В настоящее время я создаю запрос SELECT, который объединяет 12 таблиц. Я использовал Dapper для всех моих других запросов, и он отлично работает. Проблема в том, что общие методы имеют только пять общих параметров.
Я ранее модифицировал код для поддержки до 6 для другого запроса, но теперь я действительно не думаю, что я должен взломать еще 6 уровней дженериков.
Есть ли способ передать dapper массив типов, и он возвращает результаты в виде массива объектов, которые я могу использовать вручную, если мне нужно?
Я тоже, возможно, подхожу к проблеме неправильно! Любая помощь будет оценена!
Ответы
Ответ 1
В проекте, над которым я работал, я увидел нечто подобное, чтобы отобразить более 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, чтобы все можно было правильно сопоставить с объектами,
вы можете прочитать об этом здесь.
Ответ 2
Вы можете использовать динамический запрос и впоследствии отобразить его. Что-то вроде этого
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....));
Изменить: при довольно большом наборе результатов другой вариант может заключаться в использовании нескольких запросов, а затем использовании Grid Reader. Это может сработать для вас.
Вот пример, взятый из возраста dapper:
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();
...
}
Ответ 3
Это ответ уже давным-давно, но я хотел бы добавить здесь свои два цента. Вместо того, чтобы вручную изменять исходный код Dapper, почему бы вам просто не создать класс poco с этими полями и использовать ваш запрос, как таблицу?
Отображение будет работать нормально, я знаю, что это также больно для определения этого класса, но кажется более простым, чем работа с последними обновлениями Dapper.