如何从Dapper查询而不是默认(T)返回null?

时间:2012-07-30 11:29:24

标签: c# stored-procedures null dapper

我正在使用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)?

2 个答案:

答案 0 :(得分:7)

如果你的SP没有返回一行,那么dapper将不会返回一行;所以首先要检查一下:您的SP是否可能返回空行?所有null的一行?或者它返回0行?

现在,假设没有返回任何行,FirstOrDefault(标准的LINQ到对象的东西)将返回null如果CaseOfficerclass,或者是默认值如果CaseOfficerstruct,则为实例。接下来:检查CaseOfficerclass(我无法想到任何理智的原因struct)。

但是:FirstOrDefault的小精灵通常已经你想要的东西。

答案 1 :(得分:1)

您可以设置默认属性。

例如:

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获得了自动属性