Dapper 多重映射 - 集合为空
Posted
技术标签:
【中文标题】Dapper 多重映射 - 集合为空【英文标题】:Dapper multi-mapping - collections are empty 【发布时间】:2012-03-26 13:21:17 【问题描述】:我正在尝试使用 Dapper 返回一组 Shares 以及相关的 ShareItems 和 ShareHistories 的一对多集合。我的 Dapper 调用如下所示:
string sql =
@"select s.Id, s.UserId, s.Name, si.ShareId as Id, si.Name as ItemName
, sh.ShareId As Id, sh.DateShared, sh.SentTo
from Shares s
inner join ShareItems si on s.Id = si.ShareId
inner join ShareHistory sh on s.Id = sh.ShareId
where s.Id = @shareId";
return conn.Query<Share, List<ShareItem>, List<ShareHistory>, Share>(
sql,
(share, shareItems, history) =>
share.Items = shareItems;
share.History = history; return share;
,
new shareId = shareId ).Single();
当我在 SQL 中运行查询时,我得到了我期望的扁平化数据。但是,当我通过 Dapper 运行代码时,Items 和 History 集合又是空的。我一直在搞砸 splitOn 参数,但在阅读了this question 之后,我现在明白了 splitOn 正在做什么(顺便说一句,在 Dapper 网站上的某个地方会很好),我认为我处理那部分没问题。那我做错了什么?
【问题讨论】:
我现在已经为您编辑了您的代码。您应该尽量避免滚动条。它对其他人有很大帮助。而且您可能会得到更多答案。 【参考方案1】:我认为您无法从 1 行填充深层对象图。 (除非所有项目都在那一行)有一个类似的问题: Populating a list in a object with dapper
编辑:还有QueryMultiple
- 你可能想检查一下。它允许返回多个结果集。然后,您可以映射您的实体。
Query Multiple Example
【讨论】:
嗯,那太不幸了。我目前的解决方法是对每个集合进行一次数据库调用,但我希望我可以将其归结为 Dapper 中的一次数据库调用。 您检查过 QueryMultiple 函数吗?我添加了一个编辑。 QueryMultiple 是作为一个 db hit 还是一个 select 执行?如果每次选择一个,那么我不会比上面发布的原始解决方案获得太多。不过我确实试过了,它确实有效。 我会接受这个作为答案,因为它是我最终使用的。我没有借此机会分析并查看 SQL 将发生什么,但为了避免过早优化,这是完美无缺的。以上是关于Dapper 多重映射 - 集合为空的主要内容,如果未能解决你的问题,请参考以下文章