在尝试使用 Dapper 进行多映射时,我遇到了一个问题,用于分页查询。
因为我在这个分页场景中使用嵌套查询,所以嵌套查询中有多个表,我必须加入这些表才能获取我的多映射数据,但其中一些表将共享一些同名字段,您可以在我在下面的示例查询(例如id
,displayname
和email
):
q = @"select * from (select p.id, p.title, p.etc...,
u1.id, u1.displayname, u1.email,
u2.id, u2.displayname, u2.email,
t.id, t.name,
row_number() over (order by " + sort.ToPostSortSqlClause() + ") as rownum" +
" from posts p" +
" join users u1 on p.owneruserid = u1.id" +
" join users u2 on p.lastediteduserid = u2.id" +
" join topics t on p.topicid = t.id" +
") seq where seq.rownum between @pLower and @pUpper";
在上面的示例中,您可以看到在嵌套查询中,字段id
(出现在posts
表中、users
表连接和topics
表连接中)以及displayname
和email
(出现在两个users
表连接中)都会出现问题。
到目前为止,我想到的唯一解决方法是将每个“问题”字段转换为不同的名称,但这涉及在受影响的模型中创建虚拟属性的非常混乱的过程,因此多重映射可以映射到这些,并编辑如果尚未设置实际值,我的模型中的“真实”属性也会检查虚拟属性的值。
此外,在上述场景中,我必须创建 x 虚拟属性,其中 x 是我在查询中的同一个表上可能拥有的连接数(在本例中,同一个用户表上有 2 个连接,因此需要 2 个唯一命名的虚拟属性仅用于 Dapper 映射目的)。
这显然不是理想的,当我创建更多这些多映射分页查询时,我肯定会遇到问题和更多的不整洁。
我希望有一个好的,干净的解决方案来解决这个问题?