2011-08-16 66 views
20

我有一個包含一個地址對象的公司。 SQL返回值是平坦的,而且我正在使用查詢<>來加載所有對象。hardy中 - 多映射:平坦SQL返回到嵌套對象

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

我不知道如果我有SplitOn正確要麼。我得到的消息:

當使用多地圖API確保您設置的splitOn PARAM如果 你有超過ID參數名其他鍵:splitOn

建議將是巨大的。

Test.cs中的示例不是代碼要求作爲查詢的參數。這些都需要更新

+1

您可以發佈由存儲過程的調用返回的結果集列?您需要確保SplitOn中的列存在於結果集 – bdowden

+2

中返回MailingId。 proc的所有返回值都是對象的屬性/域。 – Arnej65

+1

在精巧的多映射中的最佳答案。 http://stackoverflow.com/questions/7472088/correct-use-of-multimapping-in-dapper/7478958#7478958 – CPhelefu

回答

15

這對我來說完美的作品...也許一個錯字?

我看到PhyscialId這肯定看起來像一個。

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正在按這些值拆分返回集。它正在工作。但是,我不能像上面那樣使用確切的語法。我需要給CommandType,緩衝區標誌等。 – Arnej65

+1

我想知道如果數據庫查詢有一個左外連接,並且物理信息可能不存在/ null,它會工作。這仍然有效嗎? – Marko