Ich verwende mehrere Zuordnungen für eine aktuelle Abfrage und jetzt muss ich ein anderes Objekt für die erste Abfrage zuordnen.
Beispielsweise:
public class Part {
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address {
public int Id { get; set; }
public string Street { get; set; }
public SiteOu Ou { get; set; }
}
public class SiteOu
public int Id { get; set; }
public string Name { get; set; }
}
Dapper:
connection.Query<Part, Address, Part>(sql, (part, address) => {
part.Address = address;
});
Wie erhalte ich die Address-Klasse mit den SiteOu-Informationen?
Dieses Beispiel ist nicht das, was ich tatsächlich tue, weil ich es tatsächlich getan habe
Query<T1,T2,T3,T4,T5,TResult>();
Ich mache 1 Auswahl und 5 Joins in meiner Abfrage. Hoffentlich brauche ich nicht mehr Überladungen von Query.
Mit Dapper können Sie eine einzelne Zeile mehreren Objekten zuordnen, sodass Sie SiteOu nur als Teil derselben Abfrage zuordnen können.
[Test]
public void TestSplitOn()
{
var conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Integrated Security=true;Initial Catalog=db");
conn.Open();
const string sql = "select Id = 1, Name = 'My Part', " +
"Id = 2, Street = 'My Street', " +
"Id = 3, Name = 'My Site'";
var result = conn.Query<Part, Address, SiteOu, Part>(sql, (part, address, siteOu) =>
{
part.Address = address;
address.Ou = siteOu;
return part;
},
commandType: CommandType.Text
).FirstOrDefault();
Assert.That(result, Is.Not.Null);
Assert.That(result.Address, Is.Not.Null);
Assert.That(result.Address.Ou, Is.Not.Null);
}
Wichtiger Hinweis: Dapper geht davon aus, dass Ihre ID-Spalten den Namen "Id" oder "ID" haben. Wenn Ihr Primärschlüssel anders ist oder Sie die breite Zeile an einem anderen Punkt als "Id" aufteilen möchten, verwenden Sie den optionalen Parameter 'splitOn'.
Wenn Sie mehr als 5 Typen zuordnen möchten, ist eine andere Option die QueryMultiple-Erweiterung. Hier ist ein Beispiel aus der Dapper-Dokumentation.
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();
...
}
Schau dir auch diesen Thread an .