3

Dapperのマルチ マップ クエリの一部として単一の列を返す必要があるシナリオがあります。

以下の例を簡略化しましたが、本質的に、取得したい単一の列値 (int) は Post クラスのプロパティではありません (データベース テーブルにあります)。

status が問題の int 値である例の次の行と同様の方法で使用するため、この値を単独で取得したいと考えています。

post.SetSomeStatus(status);

コード例は次のとおりです。

  var sql = 
    @"select *, p.Status from #Posts p 
    left join #Users u on u.Id = p.OwnerId
    Order by p.Id";

    var data = connection.Query<Post, User, int, Post>(sql, (post, user, status) => { 
        post.Owner = user;
        post.SetSomeStatus(status);
        return post;
    });

    var post = data.First();

このコードで次のエラーが表示されます: Index was outside the bounds of the array

4

1 に答える 1

0

エラーの理由: Index was outside of the bounds of the arrayは、Dapper がクエリ応答のセグメントを分割して、この例の戻りパラメータ Post、User & int に割り当てる方法が原因でした。Dapper の規則では、フィールド ID で分割するか、 splitOnパラメータを使用して結果セットを分割する独自のルールを提供します。

上記の例を機能させるには:

  var sql = 
    @"select *, p.Status AS ID from #Posts p 
    left join #Users u on u.Id = p.OwnerId
    Order by p.Id";

    var data = connection.Query<Post, User, int, Post>(sql, (post, user, status) => { 
        post.Owner = user;
        post.SetSomeStatus(status);
        return post;
    });

    var post = data.First();

私も助けてくれた別の質問を見つけました: Dapperでのマルチマッピングの正しい使用

于 2012-12-04T22:18:39.947 に答える