Использование 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.