2016-03-15 67 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系统下的大量测试)瓶颈。 –