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



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

因为我在这个分页场景中使用嵌套查询,所以在嵌套查询中有多个表,我必须连接这些表才能获得我的多映射数据,但是其中一些表将共享一些相同名称的字段,您可以在下面的示例查询中看到(例如id, displaynameemail):

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表连接中)将会出现问题。

到目前为止,我唯一想到的解决方法是将这些"问题"字段转换为不同的名称,但这涉及到在受影响的模型中创建虚拟属性的非常混乱的过程,因此multimapping可以映射到这些,并在我的模型中编辑"真实"属性,以检查虚拟属性的值,如果真实值尚未设置。

另外,在上面的场景中,我必须创建x个虚拟属性,其中x是我在一个查询中可能对同一表进行的连接的数量(在本例中,同一个Users表上有2个连接,因此需要2个唯一命名的虚拟属性,只是为了实现Dapper映射的目的)。

这显然不是理想的,我敢肯定,当我创建更多这些多映射分页查询时,会遇到问题和更不整洁。

我希望有一个好的,干净的解决方案来解决这个问题。

我可以想到两个选项:

选项1:连接到嵌套查询之外的扩展属性:

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来处理列混叠:

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 

然后定义alias宏,使用INFORMATION_SCHEMA.COLUMNS从db查询和缓存列列表,并为每个列添加一个'column as column_t1 '字符串。

Unalias可以很简单地做相反的事情。

最新更新