嵌套多重映射Dapper分页查询中的重复字段名问题

6

在尝试使用Dapper进行分页查询时,我遇到了一个多映射的问题。

由于在这个分页场景中使用了嵌套查询,所以在嵌套查询中有多个表需要进行连接以获取多映射数据。但是,在下面的示例查询中,一些表会共享相同名称的字段(例如iddisplaynameemail):

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表连接),以及displaynameemail(出现在两个users表连接中)。
目前我想到的唯一解决方法是将每个“有问题”的字段转换为不同的名称,但这将涉及到在受影响的模型中创建虚拟属性的非常混乱的过程,以便多重映射可以将其映射到这些属性,并且编辑我的模型中的“真实”属性,以检查虚拟属性是否具有值,如果没有设置实际值,则使用虚拟属性。
此外,在上述情况下,我必须创建x个虚拟属性,其中x是查询中可能在同一表上具有的连接数(在本示例中,2个连接同一个用户表,因此需要2个唯一命名的虚拟属性仅用于Dapper映射目的)。
这显然不是理想的解决方案,我相信还会产生其他问题和更多的混乱,因为我创建了更多的这些多映射分页查询。
我希望有一个漂亮、干净的解决方案来解决这个问题?

1
我可以想到两个选项,1)在嵌套查询之外加入回到您的表中 ) 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
谢谢Sam。我选择了你的两个建议中的第一个,它很好地完成了工作。如果你把你的评论发布为答案,我会接受它。再次感谢。 - marcusstarnes
1个回答

2
我可以想到两种方案: 方案一:在嵌套查询之外重新加入您的扩展属性:

示例代码:

select s.*, t1.*, t2.* from 
(
select s.*, ROW_NUMBER() OVER (order by somecol) AS RowNumber from Something s
) as X 
left join Table t1 on Id = x.SomeId
left join Table t2 on Id = x.SomeOtherId

选项2:扩展SqlBuilder以处理列别名:

选项2:扩展SqlBuilder以处理列别名:

select s.*, /**unalias(Table,t1)**/, /**unalias(Table,t2)**/ from 
        (
        select s.*, /**alias(Table,t1)**/, /**alias(Table,t2)**/ ROW_NUMBER() OVER (order by somecol) AS RowNumber from Something s
        left join Table t1 on Id = x.SomeId
        left join Table t2 on Id = x.SomeOtherId
        ) as X 

然后定义别名宏来使用INFORMATION_SCHEMA.COLUMNS查询并缓存数据库中的列列表,对于每个列只需添加一个“column as column_t1”的字符串即可。

取消别名可以很简单地完成反向操作。


谢谢Sam。在这种情况下,我选择了选项1,它完美地工作了。 - marcusstarnes

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