Dapper multiselect:ネストされたクラスの主キーは、 "AS"

.net c# dapper sql

質問

私には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の使い方を誤解していますか?これはバグですか?

受け入れられた回答

それはFooId分割しようとしているので、 FooId見るFooIdにデータを切断しています。このユースケースは本質的に 、すべてのテーブルがIdような予測可能なキーを持つ(珍しいことではない)シナリオを意図しています。あなたのケースでは、これはあなたがデータベースから得るように、あなたが望むものではありません:

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

しかし、それはFooIdを次のように分割しFooId

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

BarIdが第2のオブジェクトに含まれない理由と、それを最後に追加することがBarId理由BarId

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

splitOn: "FooId,BarId"


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ