我正在使用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)?
答案 0 :(得分:7)
如果你的SP没有返回一行,那么dapper将不会返回一行;所以首先要检查一下:您的SP是否可能返回空行?所有null
的一行?或者它返回0行?
现在,假设没有返回任何行,FirstOrDefault
(标准的LINQ到对象的东西)将返回null
如果CaseOfficer
是class
,或者是默认值如果CaseOfficer
是struct
,则为实例。接下来:检查CaseOfficer
是class
(我无法想到任何理智的原因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获得了自动属性