Verwenden Sie Dapper, um mehr als 5 Arten abzubilden

c# dapper sql

Frage

Ich baue gerade eine SELECT-Abfrage, die 12 Tabellen zusammenfügt. Ich benutze Dapper für alle meine anderen Fragen und es funktioniert super. Problem ist, die generischen Methoden haben nur fünf generische Parameter.

Ich habe vorher den Code geändert, um bis zu 6 für eine andere Abfrage zu unterstützen, aber jetzt glaube ich wirklich nicht, dass ich 6 weitere Ebenen von Generika hacken sollte.

Gibt es eine Möglichkeit, dapper ein Array von Typen zu übergeben, und es gibt die Ergebnisse als ein Array von Objekten zurück, die ich manuell umwandeln kann, wenn ich muss?

Ich könnte auch das Problem falsch angehen! Jede Hilfe wird geschätzt!

Akzeptierte Antwort

In einem Projekt, an dem ich gearbeitet habe, habe ich so etwas gesehen, um mehr als 7 Typen zu kartieren. Wir benutzten 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"
);

Die Abfragezeichenfolge ist selbsterklärend. Der Parameter splitOn gibt an, wie Dapper die Spalten von der SELECT-Anweisung trennen soll, damit alles den Objekten korrekt zugeordnet werden kann. Sie können dies hier lesen .


Beliebte Antwort

Sie können eine dynamische Abfrage verwenden und diese anschließend zuordnen. Etwas wie das

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....));

Bearbeiten: Bei einer ziemlich großen Ergebnismenge könnte eine weitere Option die Verwendung mehrerer Abfragen und die Verwendung eines Rasterlesers sein. Das könnte für dich funktionieren.

Da ist das Beispiel aus dem alten Zeitalter:

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();
   ...
} 


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum