기본 (T) 대신 Dapper 쿼리에서 null을 반환하는 방법?

c# dapper null stored-procedures

문제

저장 프로 시저를 통해 일부 읽기 전용 데이터베이스 호출에 Dapper 를 사용하고 있습니다. 1 행 또는 아무것도 반환하지 않습니다 쿼리가 있어요.

나는 Dapper를 다음과 같이 사용하고있다 :

using (var conn = new SqlConnection(ConnectionString))
{
    conn.Open();

    return conn.Query<CaseOfficer>("API.GetCaseOfficer", 
        new { Reference = reference }, 
        commandType: CommandType.StoredProcedure).FirstOrDefault();
}

반환 된 CaseOfficer 객체는 다음과 같습니다.

public class CaseOfficer
{
    public string Title { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Telephone { get; set; }
}

그런 다음 JSON으로 ASP.NET 웹 API 응용 프로그램을 통해 반환됩니다.

저장 프로 시저가 결과를 반환하면 다음과 같은 결과를 얻습니다.

{
    title: "Mr",
    firstName: "Case",
    lastName: "Officer",
    email: "test@example.com",
    telephone: "01234 567890"
}

그러나 그것이 아무것도 돌려주지 않을 때 나는 얻는다 :

{
    title: null,
    firstName: null,
    lastName: null,
    email: null,
    telephone: null
}

어떻게 Default (CaseOfficer)가 아닌 Dapper가 null을 반환하도록 할 수 있습니까?

수락 된 답변

SP가 행을 반환하지 않으면 dapper는 행을 반환하지 않습니다. 먼저 확인할 사항 : SP에서 빈 행을 반환 했습니까? 모든 null 의 행 s? 아니면 0 행을 반환 했습니까?

이제 행이 반환되지 않았다고 가정하면 FirstOrDefault (표준 LINQ-to-Objects)는 CaseOfficerclass null 을 반환하고 CaseOfficerstruct 경우 기본 인스턴스를 반환합니다. 그래서 다음 : CaseOfficerclass CaseOfficer 확인하십시오 ( struct 가 될 수있는 정상적인 이유를 생각할 수 없습니다).

하지만 : FirstOrDefault 하면 일반적으로 이미 원하는대로 할 수 있습니다.


인기 답변

기본 등록 정보를 설정할 수 있습니다.

예 :

public class BaseEntity
{
    public BaseEntity()
    {
        if (GetType().IsSubclassOf(typeof(BaseEntity)))
        {
            var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (var property in properties)
            {
                // Get only string properties
                if (property.PropertyType != typeof (string))
                {
                    continue;
                }

                if (!property.CanWrite || !property.CanRead)
                {
                    continue;
                }

                if (property.GetGetMethod(false) == null)
                {
                    continue;
                }
                if (property.GetSetMethod(false) == null)
                {
                    continue;
                }

                if (string.IsNullOrEmpty((string) property.GetValue(this, null)))
                {
                    property.SetValue(this, string.Empty, null);
                }
            }
        }
    }
}

public class CaseOfficer : BaseEntity
{
    public string Title { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Telephone { get; set; }
}

이제 CaseOfficer에 자동 속성이 추가되었습니다.



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