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!
In einem Projekt, an dem ich gearbeitet habe, habe ich so etwas gesehen, um mehr als 7 Typen abzubilden. Wir haben Dapper 1.38 verwendet:
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"
);
Der queryString ist selbsterklärend. Der splitOn-Parameter gibt an, wie Dapper die Spalten aus der SELECT-Anweisung aufteilen soll, damit alle Objekte ordnungsgemäß zugeordnet werden können. Weitere Informationen hierzu finden Sie hier .
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();
...
}