¿Cómo devolver null desde una consulta Dapper en lugar de por defecto (T)?

c# dapper null stored-procedures

Pregunta

Estoy usando Dapper para algunas llamadas de base de datos de solo lectura a través de un procedimiento almacenado. Tengo una consulta que devolverá 1 fila o nada.

Estoy usando Dapper así:

using (var conn = new SqlConnection(ConnectionString))
{
    conn.Open();

    return conn.Query<CaseOfficer>("API.GetCaseOfficer", 
        new { Reference = reference }, 
        commandType: CommandType.StoredProcedure).FirstOrDefault();
}

El objeto CaseOfficer devuelto se ve así:

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; }
}

Esto luego se devuelve a través de una aplicación ASP.NET Web API como JSON.

Cuando el procedimiento almacenado arroja un resultado, obtengo lo siguiente:

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

Pero cuando no devuelve nada, obtengo:

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

¿Cómo puedo hacer que Dapper devuelva nulo (para que pueda verificar y responder con 404), en lugar del valor predeterminado (CaseOfficer)?

Respuesta aceptada

Si su SP no devuelve una fila, entonces dapper no devolverá una fila; así que lo primero que debe verificar es si su SP quizás devolvió una fila vacía. Una fila de todos los null s? ¿O devolvió 0 filas?

Ahora, suponiendo que no se devolvió ninguna fila, FirstOrDefault (el elemento estándar LINQ-to-Objects) devolverá null si CaseOfficer es una class , o una instancia predeterminada si CaseOfficer es una struct . Así que siguiente: compruebe que CaseOfficer es una class (no puedo pensar en ninguna razón sensata que sea una struct ).

Pero: FirstOrDefault con FirstOrDefault generalmente ya hará lo que quieras.


Respuesta popular

Puede establecer propiedades predeterminadas.

Por ejemplo:

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; }
}

Ahora, CaseOfficer obtuvo auto-propiedades



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow