Dapper multiselect:除非使用“AS”,否則嵌套類主鍵不會映射

.net c# dapper sql

我有兩節課:

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類中輸入數據庫後,我仍然找不到任何差異。

我偶然發現的一件奇怪的事情是,如果我寫道:

"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 ^^

但是,它在FooIdFooId為:

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

這就是為什麼BarId沒有包含在第二個對像中的原因,也是為什麼將它添加到最終使它工作的原因。

還有另一種用法,IIRC,它接受按順序分配的鍵;你會用:

splitOn: "FooId,BarId"


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因