I'm using Dapper for some read-only database calls via a stored procedure. I've got a query that will either return 1 row or nothing.
I'm using Dapper like this:
using (var conn = new SqlConnection(ConnectionString))
{
conn.Open();
return conn.Query<CaseOfficer>("API.GetCaseOfficer",
new { Reference = reference },
commandType: CommandType.StoredProcedure).FirstOrDefault();
}
The returned CaseOfficer object looks like this:
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; }
}
This is then returned through a ASP.NET Web API application as JSON.
When the stored procedure returns a result I get the following:
{
title: "Mr",
firstName: "Case",
lastName: "Officer",
email: "test@example.com",
telephone: "01234 567890"
}
But when it returns nothing I get:
{
title: null,
firstName: null,
lastName: null,
email: null,
telephone: null
}
How can I get Dapper to return null (so I can check and respond with 404), rather than the default(CaseOfficer)?
If your SP doesn't return a row, then dapper won't return a row; so first thing to check: did your SP perhaps return an empty row? A row of all null
s ? Or did it return 0 rows?
Now, assuming no row was returned, FirstOrDefault
(the standard LINQ-to-Objects thing) will return null
if CaseOfficer
is a class
, or a default instance if CaseOfficer
is a struct
. So next: check CaseOfficer
is a class
(I can't think of any sane reason that would be a struct
).
But: dapper with FirstOrDefault
will generally already do what you want.
You can set default properties.
For example:
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; }
}
Now, CaseOfficer got auto-properties