嵌套多映射Dapper分頁查詢中的重複字段名稱問題

.net c# dapper orm

在嘗試使用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個連接在同一個Users表上,因此需要2個唯一名為dummy僅適用於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 

然後使用INFORMATION_SCHEMA.COLUMNS定義別名宏以查詢和緩存數據庫中的列列表,並為每列添加“column as column_t1”字符串。

Unalias可以很簡單地做到相反。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因