var sql = @"SELECT
a.id AS `Id`,
a.thing AS `Name`,
b.id AS `CategoryId`,
b.something AS `CategoryName`
FROM ..";
var products = connection.Query<Product, Category, Product>(sql,
(product, category) =>
{
product.Category = category;
return product;
},
splitOn: "CategoryId");
foreach(var p in products)
{
System.Diagnostics.Debug.WriteLine("{0} (#{1}) in {2} (#{3})", p.Name, p.Id, p.Category.Name, p.Category.Id);
}
Résulte en:
'First (#1) in (#0)'
'Second (#2) in (#0)'
CategoryId et CategoryName ont des valeurs depuis le suivant
var products = connection.Query(sql).Select<dynamic, Product>(x => new Product
{
Id = x.Id,
Name = x.Name,
Category = new Category { Id = x.CategoryId, Name = x.CategoryName }
});
Résulte en:
'First (#1) in My Category (#10)'
'Second (#2) in My Category (#10)'
Je me connecte à une base de données MySQL si cela a quelque chose à voir avec cela.
La manière la plus simple est de les appeler tous Id
(insensibles à la casse, donc juste a.id
et b.id
sont b.id
); alors vous pouvez utiliser:
public void TestMultiMapWithSplit()
{
var sql = @"select 1 as Id, 'abc' as Name, 2 as Id, 'def' as Name";
var product = connection.Query<Product, Category, Product>(sql,
(prod, cat) =>
{
prod.Category = cat;
return prod;
}).First();
// assertions
product.Id.IsEqualTo(1);
product.Name.IsEqualTo("abc");
product.Category.Id.IsEqualTo(2);
product.Category.Name.IsEqualTo("def");
}
Si vous ne pouvez pas faire cela, il existe un splitOn
optionnel splitOn
( string
) qui prend en compte une liste de colonnes séparées par des virgules pour traiter les fractionnements.