【问题标题】:Can Dapper only return flat classes?Dapper 只能返回平面课程吗?
【发布时间】:2016-03-15 11:47:06
【问题描述】:

我是一个实体框架用户,将 Dapper 作为替代方案。在 Entity Framework 中,我可以做到这一点,它将填充我的 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 });

【问题讨论】:

    标签: entity-framework dapper


    【解决方案1】:

    目前没有内置。但令我感兴趣的是,在 SQL 中实际上也没有很好的方法来做到这一点。归根结底,SQL 数据是平坦的,因此 dapper(与 SQL 非常接近)也相对平坦也就不足为奇了。

    确实有你找到的多地图的东西。我也愿意在这里使用更好的多网格阅读器来处理所需的聚合,但是......它不是一个实现甚至设计的微不足道的 API,所以它还没有简单地完成因为似乎需求量不大。

    我怀疑如果你问 EF 它正在为此运行什么 SQL,你会发现它的效率很低。选择是 n+1(x 级),或具有大量重复数据的超宽重复网格。

    【讨论】:

    • 然而,如果你想要聚合语义,也就是说,如果你的领域模型是分层的,那么平面的世界观是不够的。 EF 查询的效率无关紧要,除非它在特定系统中被证明(通过对 EF 下的 系统的广泛测试)瓶颈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多