2016-03-15 66 views
0

我是一名實體框架用戶,將Dapper視爲一種替代方案。在實體框架中,我能夠做到這一點,它將填充我的Team對象和每個玩家的玩家集合屬性以及每個玩家內的團隊屬性。小巧玲瓏只能返回平面類嗎?

var players = context.Teams 
.Include(x => x.Players) 
.AsNoTracking()          
.Where(x => x.SportId == sportId).ToList(); 

我發現這是Dapper,但它似乎只是返回一個沒有團隊數據的平面選手對象。有沒有辦法讓Dapper做EF做的事?如果是這樣,怎麼做?

var players = conn.Query<PlayerDTO, TeamDTO, PlayerDTO>("SELECT p.Id, 
p.FirstName, p.LastName, p.DateOfBirth, p.TeamId, t.Id as TeamId, t.Name, 
t.SportId FROM Team t "+ "INNER JOIN Player p ON t.Id = p.TeamId WHERE 
t.SportId = @ID", (player, team) => { return player; }, splitOn: "TeamId", 
param: new { ID = sportId }); 

回答

1

這是目前沒有內置的。但是我覺得有趣的是,在SQL中也沒有很好的方法來做到這一點。最終,SQL數據是平坦的,所以精簡(與SQL非常接近)也相對平坦不應該是一個驚喜。

確實有你找到的多地圖東西。我也願意在這裏提供一個更好的多網格閱讀器來處理所需的聚合,但是......它並不是一個簡單的API來實現甚至設計,所以它還沒有完成因爲它似乎並不是非常需要。

我懷疑如果你問EF它運行的是什麼SQL,你會發現它效率很低。選擇是n + 1(x水平),或者是具有大量重複數據的超寬重複網格。

+0

然而,如果你想要聚集語義,也就是說如果你的領域模型是分層的,那麼這個世界的平面視圖是不夠的。 EF查詢的效率是無關緊要的,除非它是在特定系統中證明的(通過EF系統下的大量測試)瓶頸。 –