gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:47:51 27 4
gpt4 key购买 nike

在尝试使用 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 映射目的的唯一命名虚拟属性)。

这显然不理想,而且我肯定会在我创建更多此类多映射分页查询时遇到问题和更多困惑。

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

最佳答案

我能想到的有 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

选项 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”字符串。

Unalias 可以非常简单地完成相反的操作。

关于c# - 嵌套多映射Dapper分页查询中的重复字段名问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7415542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com