Comment renvoyer null à partir d'une requête Dapper plutôt que par défaut (T)?

c# dapper null stored-procedures

Question

J'utilise Dapper pour certains appels de base de données en lecture seule via une procédure stockée. J'ai une requête qui renverra 1 ligne ou rien.

J'utilise Dapper comme ceci:

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

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

L'objet CaseOfficer renvoyé ressemble à ceci:

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

Ceci est ensuite renvoyé via une application Web ASP.NET ASP comme JSON.

Lorsque la procédure stockée renvoie un résultat, j'obtiens les informations suivantes:

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

Mais quand il ne retourne rien je reçois:

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

Comment puis-je obtenir que Dapper renvoie null (afin que je puisse vérifier et répondre avec 404), plutôt que la valeur par défaut (CaseOfficer)?

Réponse acceptée

Si votre SP ne renvoie pas de ligne, alors Dapper ne renverra pas de ligne. La première chose à vérifier: est-ce que votre SP a peut-être retourné une ligne vide? Une ligne de tous null s null ? Ou at-il retourné 0 lignes?

Maintenant, en supposant qu'aucune ligne n'a été renvoyée, FirstOrDefault (l'objet standard LINQ-to-Objects) renverra null si CaseOfficer est une class ou une instance par défaut si CaseOfficer est une struct . Donc prochaine: check CaseOfficer est une class (je ne peux penser à aucune raison sensée qui serait une struct ).

Mais: dapper avec FirstOrDefault fera généralement déjà ce que vous voulez.


Réponse populaire

Vous pouvez définir les propriétés par défaut.

Par exemple:

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

Maintenant, CaseOfficer a des propriétés automatiques



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi