2011-08-16 18 views
20

Bir adres nesnesini içeren bir şirketim var. SQL dönüş düz ve tüm nesneleri yüklemek için Query <> almak için tring ediyorum.dapper -multi-mapping: iç içe nesneler için düz sql dönüş

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

Ayrıca, SplitOn'un doğru olup olmadığından emin değilim. çok iyi olurdu splitOn

Öneriler:

çoklu haritalama API'leri kullanarak Kimliği Parametre adından başka anahtarlara sahip eğer splitOn param set olun: iletisini alıyorum.

Test.cs'deki örnekler, kodun sorgular için parametre olarak ne istediği değildir. Bunlar benim için

+1

Sproc çağrısı tarafından döndürülen sonuç kümesi sütunlarını gönderir misiniz? SplitOn'daki sütunların – bdowden

+2

MailingId sonuç kümesinde bulunduğundan emin olmanız gerekir. Proc'un tüm dönüş değerleri, nesnelerin özellikleri/alanlarıdır. – Arnej65

+1

Dapper'da multimapping için en iyi cevap. http://stackoverflow.com/questions/7472088/correct-use-of-multimapping-in-dapper/7478958#7478958 – CPhelefu

cevap

15

'un güncellenmesi gereken bu mükemmel bir hata ... belki bir yazım hatası?

Kesinlikle bir gibi görünen PhyscialId görüyorum.

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

SplitOn'un bu değerler tarafından ayarlanan dönüşü böldüğünü yanlış anlamıştım. Şimdi çalışıyor. Ancak, yukarıdaki sözdizimini tam olarak kullanamıyorum. CommandType, arabellek bayrağı vb. Vermem gerek. – Arnej65

+1

Veritabanı sorgusunun sol dış birleşimine sahipse ve fiziksel bilgi var olmayan/null olabiliyorsa çalışmayı merak ediyorum. Bu hala çalışır mı? – Marko