2014-09-18 53 views
0

我正在試圖用Dapper(和失敗)做以下事情。我如何獲得多映射在Dapper中工作?

我的波蘇斯(簡化所有代碼)是:

public class Company 
    { 
     public int CompanyId { get; private set; } 
     public string CompanyName { get; private set; } 
     public Person CompanyAddress { get; private set; } 
     public Person Administrator { get; private set; } 
} 
    public class Person 
    { 
     public int PersonId { get; private set; } 
     public string FirstName { get; private set; } 
     public string LastName { get; private set; } 
} 

在公司表有一個公司地址FK它映射,將personId PK Person表中的數據庫和管理員。基於thisthis我認爲follwoing是我要如何做到這一點:

public static Company Select(IDbConnection connection, int id) 
{ 
    Trap.trap(); 
    return connection.Query<Company, Person, Person, Company>("select * from Company left join Person address on Company.CompanyAddress = address.PersonId left join Person admin on Company.Administrator = admin.PersonId where Company.CompanyId = @Id", 
     (cmpy, addr, admin) => new { PersonId = id }).FirstOrDefault(); 
} 

但是,這給了我一個編譯錯誤的「新{PERSONID = ID}」。我錯了什麼?

回答

1

您需要提供SplitOn參數來指定下一個表/類的起始位置。你也應該不是創建一個匿名類型,但使用新的範圍,以初始化的CompanyAdministrator屬性:

string sql = @"select c.CompanyId,c.CompanyName, c.CompanyAddress, 
         address.PersonId, etc. .... 
       from Company c 
       left join Person address 
        on Company.CompanyAddress = address.PersonId 
       left join Person admin 
        on Company.Administrator = admin.PersonId 
       where Company.CompanyId = @Id"; 
string splitOn = "PersonId"; // maybe two parameters separated by comma, see comment below the answer 
return connection.Query<Company, Person, Person, Company>(sql, 
    (Company cmpy, Person addr, Person admin) => { cmpy.Administrator = admin; return cmpy; } 
    ,null,null,true,splitOn) 
    .FirstOrDefault(); 

不過,我不知道,因爲你有兩個連接到同一個表的作品了。所以我認爲你需要所有重複列的別名,如PersonId。但是這個遷移無論如何都有幫助。

+0

這給出了@Id需要定義的錯誤。我放棄了Dapper,我花了更多的時間試圖讓這個工作,而不是僅僅處理選擇自己。並用盡你的時間 - 對不起。 – 2014-09-19 14:57:03