在尝试使用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映射目的)。
这显然不是理想的解决方案,我相信还会产生其他问题和更多的混乱,因为我创建了更多的这些多映射分页查询。
我希望有一个漂亮、干净的解决方案来解决这个问题?
) seq join users u1 ...
... 2)扩展SqlBuilder以支持列别名/取消别名(但需要元数据)。http://samsaffron.com/archive/2011/09/05/Digging+ourselves+out+of+the+mess+Linq-2-SQL+created - Sam Saffron