Dapper에서 Multimapping의 올바른 사용

dapper

문제

dapper의 Multimapping 기능을 사용하여 ProductItems 및 관련 Customers 목록을 반환하려고합니다.

var sql = @"select * from Product p 
            inner join Customer c on p.CustomerId = c.CustomerId 
            order by p.ProductName";

var data = con.Query<ProductItem, Customer, ProductItem>(
    sql,
    (productItem, customer) => {
        productItem.Customer = customer;
        return productItem;
    },
    splitOn: "CustomerId,CustomerName"
);

내 위대한 코드는 다음과 같습니다

var sql = @"select * from Product p 
            inner join Customer c on p.CustomerId = c.CustomerId 
            order by p.ProductName";

var data = con.Query<ProductItem, Customer, ProductItem>(
    sql,
    (productItem, customer) => {
        productItem.Customer = customer;
        return productItem;
    },
    splitOn: "CustomerId,CustomerName"
);

이것은 잘 작동하지만 모든 고객 속성을 반환하려면 splitOn 매개 변수에 전체 열 목록을 추가해야하는 것 같습니다. "CustomerName"을 추가하지 않으면 null을 반환합니다. 멀티 매핑 기능의 핵심 기능을 이해하지 못했습니다. 매번 열 이름의 전체 목록을 추가하지 않아도됩니다.

수락 된 답변

난 그냥 잘 작동하는 테스트를 실행 :

ProductID | ProductName | AccountOpened | CustomerId | CustomerName 
---------------------------------------   -------------------------

splitOn 매개 변수는 분할 점으로 지정해야하며 기본값은 Id입니다. 분할 점이 여러 개인 경우 쉼표로 구분 된 목록에 추가해야합니다.

레코드 세트가 다음과 같다고 가정 해보십시오.

ProductID | ProductName | AccountOpened | CustomerId | CustomerName 
---------------------------------------   -------------------------

Dapper는이 순서로 열을 두 개의 객체로 분할하는 방법을 알아야합니다. splitOn: CustomerId 보기는 Customer가 CustomerId 열에서 시작하므로 splitOn: CustomerId 시작한다는 것을 보여줍니다.

어떤 이유로 든 기본 테이블의 열 순서가 바뀌면 여기에 경고가 있습니다.

ProductID | ProductName | AccountOpened | CustomerId | CustomerName 
---------------------------------------   -------------------------

splitOn: CustomerId 는 고객 이름이 null이됩니다.

CustomerId,CustomerName 을 분할 점으로 지정하면 dapper는 결과 집합을 3 개의 객체로 분할하려고한다고 가정합니다. 첫 번째는 처음부터 시작하고 두 번째는 CustomerId 에서 시작하고 세 번째는 CustomerName 에서 시작합니다.


인기 답변

테이블의 이름은 귀하의 것과 비슷합니다. "고객 ID"와 같은 것이 '선택 *'연산을 사용하여 두 번 반환 될 수 있습니다. 따라서 Dapper는 작업을 수행하고 있지만 너무 일찍 분할하는 경우 (가능하면) 열이 다음과 같을 수 있습니다.

select 
p.*,

c.CustomerID AS Id,
c.*

이것은 spliton : 매개 변수를 유용하지 않게 만듭니다. 특히 열이 반환되는 순서가 확실하지 않은 경우 특히 유용합니다. 물론 열을 수동으로 지정할 수는 있지만 2017이며 기본 객체 가져 오기는 더 이상 필요하지 않습니다.

우리가하는 일은 수년 동안 수천 개의 질의를 처리하는 데 아주 효과적입니다. 단순히 Id에 대한 별칭을 사용하고 Dapper의 기본 'Id'를 사용하여 spliton을 지정하지 마십시오.

select 
p.*,

c.CustomerID AS Id,
c.*

... 짜잔! Dapper는 기본적으로 Id에만 분할되며 Id는 모든 고객 열 앞에 나타납니다. 물론 반환 결과 집합에 여분의 열을 추가 할 것입니다. 그러나 어떤 열이 어떤 개체에 속하는지 정확히 알 수있는 추가 된 유틸리티에 대해서는 최소한의 오버 헤드입니다. 그리고 당신은 쉽게 이것을 확장 할 수 있습니다. 주소와 국가 정보가 필요하십니까?

select 
p.*,

c.CustomerID AS Id,
c.*

무엇보다도, 당신은 어떤 SQL 문이 어떤 객체와 연관되어 있는지를 최소한으로 보여주고 있습니다. Dapper가 나머지를 처리합니다.




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