5

ページネーションクエリのために、Dapper を使用してマルチマッピングを実行しようとすると、問題が発生しました。

このページネーション シナリオではネストされたクエリを使用しているため、ネストされたクエリ内に複数のテーブルがあり、それらを結合してマルチマップ データを取得する必要がありますが、これらのテーブルの一部は同じ名前のフィールドを共有しています。以下のクエリの例 (例: iddisplaynameおよびemail):

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両方に表示される)と(両方のテーブル結合に表示される)フィールドに問題があることがわかります。userstopicsdisplaynameemailusers

これまでに考えた唯一の回避策は、これらの「問題のある」フィールドのそれぞれを別の名前にキャストすることですが、これには、影響を受けるモデルにダミー プロパティを作成するという非常に面倒なプロセスが必要になるため、マルチマッピングがこれらにマッピングされ、実際の値が設定されていない場合は、モデルの「実際の」プロパティも値のダミー プロパティをチェックします。

また、上記のシナリオでは、x 個のダミー プロパティを作成する必要があります。ここで、x は、クエリ内の同じテーブルで使用できる結合の数です (この例では、同じ Users テーブルで 2 つの結合があるため、一意の名前のダミーが 2 つ必要です)。プロパティは Dapper マッピングのみを目的としています)。

これは明らかに理想的ではなく、これらの複数マッピングのページ付けクエリをさらに作成するにつれて、問題が発生し、乱雑さが増していると確信しています。

この問題に対するすてきでクリーンな解決策があることを願っていますか?

4

1 に答える 1

1

私が考えることができる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 

次に、エイリアス マクロを定義して、db から列のリストを照会およびキャッシュし、INFORMATION_SCHEMA.COLUMNS各列に「column_t1」文字列を追加するだけです。

Unalias はその逆を非常に簡単に行うことができます。

于 2011-09-15T08:04:54.447 に答える