如何從Dapper查詢而不是默認(T)返回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; }
}

然後通過ASP.NET Web API應用程序將其作為JSON返回。

當存儲過程返回結果時,我得到以下內容:

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

但當它返回任何我得到的:

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

我怎樣才能讓Dapper返回null(所以我可以檢查並回复404),而不是默認(CaseOfficer)?

一般承認的答案

如果你的SP沒有返回一行,那麼dapper將不會返回一行;首先要檢查一下:您的SP是否可能返回空行?一行所有null s?或者它返回0行?

現在,假設沒有返回任何行,如果CaseOfficer是一個class ,則FirstOrDefault (標準的LINQ-to-Objects事物)將返回null ,如果CaseOfficer是一個struct ,則返回默認實例。接下來:檢查CaseOfficer是一個class (我想不出任何理智的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
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因