Dapper를 사용하여 두 개의 DB 열을 하나의 데이터 형식으로 매핑

c# dapper

문제

어쨌든 데이터베이스에서 두 개의 열을 .Net 데이터 형식으로 매핑 할 수 있습니까?
내 시나리오는 데이터베이스에 화폐 값이 두 개의 열로 표시된다는 것입니다.

Cost         Decimal(19,4)  
CostCurrency char(3)

그리고 그것을 사용자 지정 데이터 형식에 매핑 된 Money 싶습니다.

public partial struct Money
{
   public Money(decimal amount, string currency)
   {
   }
}

보험 회사 예 :

public class Insurance
{
    public string Id {get;set;}
    public Money Cost {get;set;}
}

나는 SqlMapper.TypeHandler<Money> 있었지만 한 번에 하나의 열만 읽고 쓸 수있는 것 같습니다.

수락 된 답변

Dispper의 Split 기능을 사용해야했습니다.

var insurance = (await con.QueryAsync<Insurance, decimal, string, Insurance>(
                   sql,
                   (entity, cost, costCurrency) =>
                   {
                       entity.Cost = new Money(cost, costCurrency);
                       return entity;
                   },
                   splitOn: "Cost, CostCurrency",
                   param: new { Id = id })).Single();

인기 답변

필자는 개인 속성을 사용하여 데이터 저장소를 나타내면 복잡한 속성의 매핑을 크게 단순화 할 수 있습니다. Dapper는 개인 속성에 매핑됩니다.

public class Insurance
{
    #region Data
    private decimal Cost{get{return this.CurrentCost.Amount;} set{this.CurrentCost.Amount = value;}}
    private string Currency{get{return this.CurrentCost.Currency;} set{this.CurrentCost.Currency = value;}}
    #endregion


    public string Id {get;set;}

    //Changed prop name to not confuse it with storage columns
    public Money CurrentCost {get;set;}

    public Insurance(){
        //initialize this so that it won't blow up on mapping
        this.CurrentCost = new Money();
    }
}

처음에는 홍당무로 만들었습니다. 이것은 우리가 객체를 계속 유지하고 맵핑하기 위해 객체를 마크 업하는 것처럼 느낍니다. 그러나 그것은 매직 맵핑이 없기 때문에 아주 간단합니다. 당신은 단위 테스트도 할 수 있습니다. 그리고이 기술을 사용하여 수백 개의 개체를 유지하는 프로젝트라도 시간이 많이 걸릴뿐 아니라 프로젝트가 성장함에 따라 전적으로 유연하고 관리하기 쉽습니다.



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