Dapper가 중복 된 조인 결과를 위해 새 객체를 생성합니까?

c# dapper

문제

Dapper가 JOIN 수행하면 각 a , b , c 의 생성자가 호출됩니까? 또는 각각의 고유 한 a , b , c ?

string sql = @"SELECT a.*, b.*, c.* 
               FROM A a
               JOIN B b ON b.Id = a.BId
               JOIN C c ON b.Id = c.BId";

var results = db.Query<A, B, C, A>(sql, (a, b, c) => { return a; });

예를 들어, 내가 c 복사본을 가지고 있다면, Dapper는 여러 번 c 의 생성자를 호출 할 것인가?

아니면 Id가 행 사이에서 동일하다는 것을 알아 채고 id가 같은 모든 인스턴스에 대해 동일한 객체를 전달합니까?

편집하다:

몇 가지 테스트를 거친 후에는 중복 값에 대해 생성자를 여러 번 호출하는 것처럼 보입니다.

Dapper API를 사용하여이 문제를 해결할 수있는 간단한 방법이 있습니까?

인기 답변

나는 내 해결책을 제안 할 것이지만 누군가가 더 좋은 아이디어를 가지고있는 경우에 대비하여이 질문을 공개적으로 남겨 두겠다.

이것이 내가 한 일이다.

List<dynamic> results = db.Query<dynamic, dynamic, dynamic, dynamic>(sql,
    (a, b, c) => { return new { a, b, c }; }).ToList(); // splitOn: 'Id'

List<dynamic> a_ids = new List<dynamic>();
List<dynamic> b_ids = new List<dynamic>();
List<dynamic> c_ids = new List<dynamic>();

List<A> unique_as = new List<A>();
List<B> unique_bs = new List<B>();
List<C> unique_cs = new List<C>();
foreach (var row in results)
{
    var a = row.a;
    var b = row.b;
    var c = row.c;
    if(!a_ids.Contains(a.Id)) unique_as.Add(new A(a.Id));
    if(!b_ids.Contains(b.Id)) unique_bs.Add(new B(b.Id));
    if(!c_ids.Contains(c.Id)) unique_cs.Add(new C(c.Id));
}

Dapper가 미래에 어떻게 든 이것을 지원한다면 좋겠지 만 그때까지는 이것이 다른 누군가에게 도움이되기를 바랍니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow