ページネーションクエリのために、Dapper を使用してマルチマッピングを実行しようとすると、問題が発生しました。
このページネーション シナリオではネストされたクエリを使用しているため、ネストされたクエリ内に複数のテーブルがあり、それらを結合してマルチマップ データを取得する必要がありますが、これらのテーブルの一部は同じ名前のフィールドを共有しています。以下のクエリの例 (例: id
、displayname
および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
両方に表示される)と(両方のテーブル結合に表示される)フィールドに問題があることがわかります。users
topics
displayname
email
users
これまでに考えた唯一の回避策は、これらの「問題のある」フィールドのそれぞれを別の名前にキャストすることですが、これには、影響を受けるモデルにダミー プロパティを作成するという非常に面倒なプロセスが必要になるため、マルチマッピングがこれらにマッピングされ、実際の値が設定されていない場合は、モデルの「実際の」プロパティも値のダミー プロパティをチェックします。
また、上記のシナリオでは、x 個のダミー プロパティを作成する必要があります。ここで、x は、クエリ内の同じテーブルで使用できる結合の数です (この例では、同じ Users テーブルで 2 つの結合があるため、一意の名前のダミーが 2 つ必要です)。プロパティは Dapper マッピングのみを目的としています)。
これは明らかに理想的ではなく、これらの複数マッピングのページ付けクエリをさらに作成するにつれて、問題が発生し、乱雑さが増していると確信しています。
この問題に対するすてきでクリーンな解決策があることを願っていますか?