如何使用Dapper ORM获取子对象的值?

6

我正在使用以下内容检索个人资料详情:

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

配置文件对象包含其他集合,如配置文件图像。问题在于每个子对象的项目计数为零。此外,我只想获取例如配置文件图像的数据。

是否需要设置以查询子对象,如果需要,是否可以指定哪个子对象以及多少级别?

我还尝试了多重映射:

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

我遇到了以下错误:

使用多重映射API时,请确保设置splitOn参数,如果您有除Id之外的键,则需要设置该参数。 参数名称:splitOn

我已经尝试了各种不同的splitOn文本,但仍然收到相同的错误消息。

1个回答

10

Dapper不支持开箱即用的一对多映射。不过,可以查看这个问题,它可能会有所帮助。

多重映射,一对多

如果你的PROFILEIMAGES表在PROFILES ID上有一个外键,那么你可以发出两个查询并使用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();
} 

1
很好。我实际上比返回所有1..*映射更喜欢这种方式,因为那可能会导致复杂对象膨胀。当然,它们有很多信息,但可能有一些是不必要的。通过这种方式,我可以明确请求需要从哪些子表中获取数据。谢谢。 - ElHaix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接