8

我正在通过存储过程将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)?

4

2 回答 2

7

如果你的 SP 没有返回一行,那么 dapper 就不会返回一行;所以首先要检查:你的 SP 是否可能返回一个空行?一排所有null的 s ? 还是返回 0 行?

现在,假设没有返回任何行,FirstOrDefault(标准 LINQ-to-Objects 事物)将返回nullifCaseOfficer是 a class,或者返回一个默认实例 ifCaseOfficer是 a struct。所以接下来: checkCaseOfficer是 a class(我想不出任何理智的理由是 a struct)。

但是:dapper withFirstOrDefault通常会你想做的事。

于 2012-07-30T11:37:36.257 回答
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 获得了自动属性

于 2014-06-04T07:46:00.920 回答