2012-04-19 54 views
5

我檢索輪廓細節有以下:如何使用Dapper ORM獲取子對象的值?

var profiles = connection.Query<Models.PROFILE>("SELECT * FROM PROFILES WHERE [email protected]", new { ID = profileID }); // IEnumerable 
var profile = profiles.First<Models.PROFILE>(); 

Profile對象包含其他收藏品一樣profileImages。問題是每個子對象的項目數都是零。另外,我只想獲取say,profileImages的數據。

是否有需要設置查詢子對象的東西,如果有,是否可以指定哪一個以及多少個級別?

我也曾嘗試multimapping:

   var profiles = connection.Query<Models.PHOTOS_PERMISSIONS, Models.PROFILE, Models.PHOTOS_PERMISSIONS>(sql, 
        (p1, p2) => { p1.ID = profileID; return p1; }, 
        new { ID = profileID }, 
        splitOn: "OWNER_PROFILESIDFK, ID").AsQueryable(); 

PHOTOS_PERMISSIONS.OWNER_PROFILESIDFK = PROFILE.ID

並獲得以下錯誤:

When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id Parameter name: splitOn

我試圖在我的splitOn一個什麼樣的變化文字,但仍然得到相同的錯誤。

回答

8

Dapper不支持這種開箱即用的One-To-Many映射。看看這個問題,但它可能有幫助。

Multi-Mapping, one-to-many

如果您PROFILEIMAGES表中有一個FK上的配置文件ID - 可以發出2個querys,並使用GridReader。

var sql = 
@" 
select * from PROFILES where profileId= @id 
select * from PROFILEIMAGES where OWNER_PROFILESIDFK = @id"; 

using (var multi = connection.QueryMultiple(sql, new {id=selectedId})) 
{ 
    var profile = multi.Read<Models.PROFILE>().Single(); 
    profile.ProfileImages = multi.Read<Model.PROFILEIMAGES>().ToList(); 
} 
+0

不錯。我實際上比這更好地返回所有1 .. *映射,因爲這可能會導致複雜的對象膨脹。當然他們有很多信息,但也許有一些不是必需的。通過這種方式,我可以明確地請求我需要哪些子表。謝謝。 – ElHaix 2012-04-23 13:22:15