2011-08-16 13 views
20

Ho una società che contiene un oggetto indirizzo. Il ritorno SQL è piatto e sto cercando di ottenere Query <> per caricare tutti gli oggetti.dapper -multi-mapping: flat sql return to nested objects

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

Non sono sicuro se ho lo SplitOn corretto. Sto ottenendo il messaggio:

Quando si usano le API multi-mapping si assicuri di impostare il parametro splitOn se avete le chiavi diverse nome parametro ID: splitOn

Suggerimenti sarebbe grande.

Gli esempi in Test.cs non sono ciò che il codice richiede come parametri per le query. Questi devono essere aggiornati

+1

È possibile pubblicare le colonne della serie di risultati restituite dalla chiamata sproc? È necessario assicurarsi che le colonne in SplitOn esistano nel set di risultati. – bdowden

+2

MailingId viene restituito. Tutti i valori di ritorno del proc sono le proprietà/campi degli oggetti. – Arnej65

+1

La migliore risposta per la multimapping in dapper. http://stackoverflow.com/questions/7472088/correct-use-of-multimapping-in-dapper/7478958#7478958 – CPhelefu

risposta

15

per me questo funziona perfettamente ... forse un refuso?

Vedo PhyscialId che sembra decisamente 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

Ho frainteso che SplitOn stia dividendo il ritorno impostato da quei valori. Funziona ora. Tuttavia, non sono in grado di utilizzare la sintassi esatta come sopra. Ho bisogno di dare il CommandType, il buffer buffer ecc. – Arnej65

+1

Mi chiedevo se avrebbe funzionato se la query del database avesse un join esterno sinistro e le informazioni fisiche potrebbero essere inesistenti/null. Funzionerebbe ancora? – Marko