2011-08-16 4 views
20

Tengo una empresa que contiene un objeto de dirección. El retorno de SQL es plano, y estoy tratando de obtener Query <> para cargar todos los objetos.dapper -multi-mapping: sql plano de retorno a los objetos anidados

cnn.Query<Company,Mailing,Physical,Company>("Sproc", 
        (org,mail,phy) => 
        { 
         org.Mailing = mail; 
         org.Physical = phy; 
         return org; 
        }, 
        new { ListOfPartyId = stringList }, null, true, commandTimeout: null, 
        commandType: CommandType.StoredProcedure, splitOn: "MailingId,PhyscialId").ToList(); 

No estoy seguro si tengo el SplitOn correcto tampoco. Estoy recibiendo el mensaje:

Al utilizar las API multi-mapeo asegurar que establecer el parámetro splitOn si tiene teclas que no sean ID Nombre del parámetro: splitOn

sugerencia sería grande.

Los ejemplos en Test.cs no son lo que el código solicita como parámetros para las consultas. Estos deben actualizarse

+1

¿Puede publicar las columnas del conjunto de resultados que devuelve la llamada sproc? Debe asegurarse de que las columnas en SplitOn existan en el conjunto de resultados – bdowden

+2

Se devuelve MailingId. Todos los valores de retorno del proceso son las propiedades/campos de los objetos. – Arnej65

+1

La mejor respuesta para multimapping en dapper. http://stackoverflow.com/questions/7472088/correct-use-of-multimapping-in-dapper/7478958#7478958 – CPhelefu

Respuesta

15

para mí esto funciona perfecto ... ¿tal vez un error tipográfico?

Veo PhyscialId que definitivamente parece uno.

class Company 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Mailing Mailing { get; set; } 
    public Physical Physical { get; set; } 
} 

class Mailing 
{ 
    public int MailingId { get; set; } 
    public string Name { get; set; } 
} 

class Physical 
{ 
    public int PhysicalId { get; set; } 
    public string Name { get; set; } 
} 

public void TestSOQuestion() 
{ 
    string sql = @"select 1 as Id, 'hi' as Name, 1 as MailingId, 
     'bob' as Name, 2 as PhysicalId, 'bill' as Name"; 
    var item = connection.Query<Company, Mailing, Physical, Company>(sql, 
       (org, mail, phy) => 
       { 
        org.Mailing = mail; 
        org.Physical = phy; 
        return org; 
       }, 
        splitOn: "MailingId,PhysicalId").First(); 


    item.Mailing.Name.IsEqualTo("bob"); 
    item.Physical.Name.IsEqualTo("bill"); 

} 
+0

No entendí que SplitOn está dividiendo el retorno establecido por esos valores. Está trabajando ahora. Sin embargo, no puedo usar la sintaxis exacta como lo has hecho anteriormente. Necesito dar el CommandType, la bandera del buffer, etc. – Arnej65

+1

Me preguntaba si funcionaría si la consulta de la base de datos tuviera una combinación externa izquierda y la información física podría ser inexistente/nula. ¿Esto todavía funcionaría? – Marko

Cuestiones relacionadas