Dapper를 사용하여 5 가지 이상의 유형 매핑

c# dapper sql

문제

현재 12 개의 테이블을 함께 조인하는 SELECT 쿼리를 작성 중입니다. 나는 Dapper를 다른 모든 쿼리에 사용하고 있으며 훌륭하게 작동합니다. 문제는 제네릭 메서드가 5 개의 일반 매개 변수 만 가질 수 있다는 것입니다.

이전에 다른 쿼리에 대해 최대 6 개를 지원하도록 코드를 수정했지만 이제는 6 개 수준의 제네릭을 해킹해야한다고 생각하지 않습니다.

어떻게 dapper 배열 배열을 넘겨 줄 수 있습니까? 객체 배열로 결과를 반환합니다. 수동으로 캐스트 할 수 있습니까?

나는 또한 문제를 잘못된 방향으로 접근하고있을 수도 있습니다! 어떤 도움을 주시면 감사하겠습니다!

수락 된 답변

내가 일한 프로젝트에서 7 가지 이상의 맵핑을 얻기 위해 이와 같은 것을 보았습니다. 우리는 Dapper 1.38을 사용했습니다.

connection.Query<TypeOfYourResult>
(
   queryString,
   new[]
   {
      typeof(TypeOfArgument1),
      typeof(TypeOfArgument2),
      ...,
      typeof(TypeOfArgumentN)
   },
   objects =>
   {
      TypeOfArgument1 arg1 = objects[0] as TypeOfArgument1;
      TypeOfArgument2 arg2 = objects[1] as TypeOfArgument2;
      ...
      TypeOfArgumentN argN = objects[N] as TypeOfArgumentN;

     // do your processing here, e.g. arg1.SomeField = arg2, etc.
     // also initialize your result

     var result = new TypeOfYourResult(...)

     return result;
   },
   parameters,
   splitOn: "arg1_ID,arg2_ID, ... ,argN_ID"
);

queryString은 자명하다. splitOn 매개 변수는 Dapper가 모든 것을 객체에 올바르게 매핑 할 수 있도록 SELECT 문에서 열을 분할하는 방법을 알려줍니다. 여기에서 읽을 수 있습니다 .


인기 답변

동적 쿼리를 사용하여 나중에 매핑 할 수 있습니다. 이 같은

var sql = 
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";

using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
{
   var customer = multi.Read<Customer>().Single();
   var orders = multi.Read<Order>().ToList();
   var returns = multi.Read<Return>().ToList();
   ...
} 

편집 : 다소 큰 결과가 나오면 다른 옵션으로 여러 개의 쿼리를 사용한 다음 그리드 리더를 사용할 수 있습니다. 그건 너에게 도움이 될거야.

어리석은 나이에서 가져온 예가 있습니다.

var sql = 
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";

using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
{
   var customer = multi.Read<Customer>().Single();
   var orders = multi.Read<Order>().ToList();
   var returns = multi.Read<Return>().ToList();
   ...
} 



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