Dapper multiselect : 중첩 된 클래스 기본 키는 "AS"를 사용하지 않는 한 매핑하지 않습니다.

.net c# dapper sql

문제

두 클래스가 있습니다.

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

다음과 같은 쿼리를 실행하면 :

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 클래스에 대해 입력 한 후에도 차이점을 찾을 수 없었습니다.

내가 우연히 발견 한 이상한 일은 내가 이렇게 썼다면 :

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

Bar.BarId는 실제로 예상대로 매핑되었지만 Dapper를 사용하는 방법을 잘못 이해했거나 버그입니까?

수락 된 답변

에 분할 할 노력하고있다 FooId , 그것을보고 너무마다 FooId 이 데이터를 절단됩니다. 이 유스 케이스는 본질적으로 모든 테이블이 Id 와 같은 예측 가능한 키를 갖는 (드물지 않은) 시나리오를위한 것이다. 귀하의 경우 데이터베이스에서 얻을 때 원하는 것은 아닙니다.

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

그러나 FooId 는 다음과 같이 나뉩니다.

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

BarId 가 두 번째 객체에 포함되지 않는 이유와 마지막에 추가하는 것이 왜 BarId 가 있는지를 BarId 줍니다.

에 분할 시퀀스 된 키를 받아 다른 사용, IIRC가있다; 당신은 다음을 사용합니다 :

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



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.