3

私には2つのクラスがあります:

class Foo{
    public int FooId { get; set; }
    ...
    public Bar Bar { get; set }
}

class Bar{
    public int BarId { get; set; }
    public int FooId { get; set }
    ...
}

次に、次のようにクエリを実行すると、次のようになります。

sqlConnection.Query<Foo, Bar, Foo>(
    "SELECT * FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId",
    (foo, bar) => { 
         foo.Bar = bar;
         return foo; 
       }, 
    splitOn: "FooId");

その結果、FooとBarの両方のすべてのプロパティがBar.BarIdを除いてマップされます。列名を確認し、データベースをBarクラスと照合した後も、違いは見つかりませんでした。

私が偶然見つけた奇妙なことの1つは、次のように書いた場合です。

"SELECT *, BarId AS BarId FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId"

Bar.BarIdは実際に期待どおりにマッピングされていますが、Dapperの使用方法を誤解していませんか、それともバグですか?

4

1 に答える 1

6

で分割を実行しようとしているFooIdため、表示されるたびFooIdにデータがカットされます。このユースケースは、基本的に、すべてのテーブルに。などの予測可能なキーがある(珍しいことではない)シナリオを対象としていIdます。あなたの場合、データベースから取得するので、これはあなたが望むものではありません:

FooId, a, b, c | BarId, FooId, x, y, z
^^ from Foo ^^ | ^^ from Bar ^^

ただし、それは次のように分割さFooIdれます。

FooId, a, b, c, BarId | FooId, x, y, z

これがBarId、2番目のオブジェクトに含まれない理由であり、最後に追加すると機能する理由でもあります。

別の使用法であるIIRCがあり、シーケンスされたキーを受け入れて分割します。使用するもの:

splitOn: "FooId,BarId"
于 2011-07-15T10:35:07.603 に答える