2011-05-19 5 views
7
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); 
} 

Resultados en:¿Cómo se nombran las columnas para compatibilidad con múltiples mapas en Dapper?

'First (#1) in (#0)' 
'Second (#2) in (#0)' 

IdCategoría y tiene valores desde los siguientes

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

Resultados en:

'First (#1) in My Category (#10)' 
'Second (#2) in My Category (#10)' 

Estoy de conexión a una base de datos MySQL si eso tiene algo que ver con eso.

+0

estás utilizando spliton correctamente allí, ¿te importa enviar una prueba fallida al rastreador en el código de google? –

+0

@Sam Supongo que debería haber funcionado si hubiera cambiado ''CategoryName'' por' 'Name''? Tenía la impresión de que Dapper usaría alguna convención de Automapper para mapear '' CategoryName'' (también intenté '' Category.Name'') a 'x.Category.Name' – loraderon

+0

, sí, tienes razón @loraderon, no agrega Categoría a todos los accesorios ... de hecho, es más simple manejar nombres de columnas duplicados en el conjunto de resultados. entonces puedes hacer cosas como 'select * from Posts p join Authors a on p.AuthorId = a.Id' que es tan sucinto –

Respuesta

9

La manera más simple es llamarlos a todos Id (no distingue entre mayúsculas y minúsculas, por lo que solo a.id y b.id están bien); entonces usted puede utilizar:

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 no puede hacer eso, no es un parámetro opcional splitOn (string) que toma una lista separada por comas de columnas para tratar a las divisiones.

+0

¡Nunca pensé que sería tan fácil! ¡Gracias! – loraderon

+0

@loraderon somos excepcionalmente flojos, y escribimos cosas que son fáciles de usar; p –

Cuestiones relacionadas