열 이름에 접두어가있는 대퍼 맵

c# dapper

문제

나는 다음과 같이 2 개의 클래스, 주문과 주소를 가지고있다 :

public class Order
{
    public string OrderId { get; set; }
    public Address ShippingAddress { get; set; }
    public Address BillingAddress { get; set; }
}

public class Address
{
    public string Street { get; set; }
    public string Town { get; set; }
    public string Zip { get; set; }
}

데이터베이스는 주문과 주소를 다음과 같은 단일 테이블에 저장합니다.

CREATE TABLE Orders
    (
        OrderId NVARCHAR(56) PRIMARY KEY,
        BillingStreet NVARCHAR(256),
        BillingTown NVARCHAR(256),
        BillingZip NVARCHAR(256),
        ShippingStreet NVARCHAR(256),
        ShippingTown NVARCHAR(256),
        ShippingZip NVARCHAR(256)
    )

여기에 이미지 설명을 입력하십시오.

이 클래스를 Order 클래스에 매핑하려면 어떻게해야합니까?

수락 된 답변

다음은 쿼리가 청구 및 운송 열을 일반화하고 여러 유형을 사용하고 "주소"라는 열을 볼 때 분리하도록 지시하는 Query 버전을 사용하여이를 수행하는 방법입니다. 그런 다음 Address 객체를 Order 객체의 해당 속성에 할당하면됩니다.

connection.Query<Order, Address, Address, Order>(
    @"SELECT OrderId, 
             BillingAddress As Address, 
             BillingTown As Town, 
             BillingZip As Zip, 
             ShippingAddress As Address, 
             ShippingTown As Town, 
             ShippingZip As Zip,  
      FROM Orders",
    (o, ba, sa) =>
    {
        o.BillingAddress = ba;
        o.ShippingAddress = sa;
        return o;
    },
    splitOn: "Address");

인기 답변

Dapper가 행을 단일 객체로 취급하기 때문에 가능하지 않다고 생각합니다. 테이블 구조를 변경하면 가능할 수 있습니다.

CREATE TABLE Orders
(
    OrderId NVARCHAR(56) PRIMARY KEY,
    BillingAddressId INT
    ShippingAddressId INT
)

그런 다음 수업을 다음과 같이 변경해야합니다.

public class Order
{
    public string OrderId { get; set; }
    public int ShippingAddressId {get; set;}
    public virtual Address ShippingAddress { get; set; }
    public int BillingAddressId {get; set;}
    public virtual Address BillingAddress { get; set; }
}

그리고 다중 매핑을 사용하십시오.

또 다른 옵션은 Dapper-FluentMap 또는 Dapper Extension 과 같은 Dapper 확장을 사용하여 열을 클래스에 매핑하는 데 도움이됩니다.



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