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

mar*_*nes 5 .net c# orm 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";
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您可以看到在嵌套查询中,字段会id出现问题(显示在posts表中,users表连接和topics表连接),displayname以及email(和两个users表连接中都出现).

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

此外,在上面的场景中,我将不得不创建x虚拟属性,其中x是我在查询中的同一个表上可能具有的连接数(在此示例中,2个连接在同一个Users表上,因此需要2个唯一名为dummy仅适用于Dapper映射目的的属性).

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

我希望这个问题有一个很好的,干净的解决方案吗?

Sam*_*ron 2

我能想到有两种选择:

选项 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
Run Code Online (Sandbox Code Playgroud)

选项 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 
Run Code Online (Sandbox Code Playgroud)

然后定义别名宏来查询和缓存数据库中的列列表INFORMATION_SCHEMA.COLUMNS,并简单地为每列添加一个“column as column_t1”字符串。

Unalias 可以非常简单地执行相反的操作。