일반 및 Nullable 사용 방법 구체화를 위해 Dapper에 입력 하시겠습니까?

c# dapper generics nullable tuples

문제

나는이 부름을 받았다.

public IObservable<T> Subscribe(object topic, string service, string connectionString, string query)
{
    try
    {
        this.connection.ConnectionString = connectionString;
        this.connection.Open();
        this.connection.Query<T>(query, new { transactionid = topic }).ToObservable().Subscribe(message => this.subject.OnNext(message));
        return this.subject;
    }
    catch (Exception e)
    {
        this.subject.OnError(e);
        return this.subject;
    }
    finally
    {
        this.subject.OnCompleted();
        this.connection.Close();
    }
}

이것은 내 질문입니다.

with IDS as  (select L1_ID, L2_ID, L1_VALUE, L2_VALUE 
from MYDB where MYDB.ID = :transactionid) 
select * from 
(select L1_ID as ID, round(L1_VALUE, 28) as VALUE from IDS
union 
select L2_ID as ID, round(L2_VALUE, 28) as VALUE from IDS) UN

이 오류가 throw됩니다.

System.Tuple 2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Nullable 대해 매개 변수없는 기본 생성자 또는 하나의 일치하는 서명 (System.String ID, System.Decimal VALUE) 2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Nullable 1 [[System.Decimal, mscorlib, 버전 = 4.0.0.0, 문화 = 중립, PublicKeyToken = b77a5c561934e089]], mscorlib, 버전 = 4.0.0.0, 문화 = 중립, PublicKeyToken = b77a5c561934e089]

수락 된 답변

여기에있는 문제는 Nullable<T> 가 아니라 Tuple<,> 입니다.

Dapper는 두 가지 패턴 중 하나를 가정합니다. 데이터에 열이 있다고 가정 해 보겠습니다.

ID      varchar
VALUE   decimal

(그 이후로 귀하의 시나리오에있는 것 같다)

그것을 T 로로드하려면, ( 0ID 이고 1VALUE 인 것으로 결정된 후에) 다음 중 하나 를 수행하려고합니다.

T row = new T() { ID = reader.GetInt32(0), VALUE = reader.GetDecimal(1) };

또는

T row = new T(ID: reader.GetInt32(0), VALUE: reader.GetDecimal(1));

여기서 많은 것을 단순화하고 있으며 대소 문자를 구분하는 것은 용서할 만하지만 기본적으로 원하는 것입니다.

문제는 다음과 같습니다. Tuple<T1,T2> 중 하나가 없습니다 . 그것은 생성자를가집니다 :

public Tuple(T1 item1, T2 item2);

여기서는 작동하지 않을 것입니다. 대퍼는 어디로 가야 할지를 절대 확신 할 수 없으므로 시도하지 않습니다 . 이것은 가혹한 것처럼 들리지만, 대다수는 열 순서에 대해 신경 쓰지 않으려 고 하며, 일반적인 경우 (열이 모두 다른 유형이 아닌 경우)에는 일치 항목이 없을 때 정확한 접근 방법이 무엇인지 분명하지 않습니다.

옵션 :

  1. 양식의 사용자 정의 유형을 작성하십시오.

    public class SomeType { // could also be a struct, immutable, whatever
        public int Id {get;set;}
        public decimal Value {get;set;}
    }
    

    T === SomeType

  2. 비 제네릭 API를 사용하고 다시 매핑하십시오.

    Query(query, new { transactionid = topic }).Select(
        row => Tuple.Create((int)row.ID, (decimal)row.VALUE
    ).Whatever(...);
    
  3. 결과 열의 이름을 item1item2 (yeuch!)로 지정하십시오.



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