Valeur par défaut pour la liste IEnumerable multi mappée dapper lorsque le résultat est nul

c# dapper

Question

J'ai le code suivant qui interroge une base de données par procédure stockée. Lorsque ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable(); n'est pas nul, le retour est correct; Cependant, je ne peux pas trouver un moyen de gérer un retour nul via Dapper / linq avec un type de collection.

Ma procédure stockée:

SELECT    states.name as stateName,   fam.*
FROM            Family fam
WHERE        fam.idUserName=@username 

SELECT      person.*
FROM            person
INNER JOIN Family fam on fam.Id = person.idFamily
WHERE        fam.idUserName=@username

Lorsque la deuxième instruction SQL contient des enregistrements, la définition de ReturnObject.familymembers ne pose aucun problème, mais je ne parviens pas à déterminer comment spécifier un paramètre par défaut ou gérer un retour à zéro à partir de Dapper. Lors du débogage, ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable() génère une exception null si aucune ligne n'a été renvoyée.

Voici ce que je pensais que cela fonctionnerait, mais pas:

ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable().DefaultIfEmpty<InternalObjects.Person>();

        public InternalObjects.FamilyDashboard GetDashboardInfo(string username)
    {
        InternalObjects.FamilyDashboard ReturnObject = new InternalObjects.FamilyDashboard();

        using (var dbConnection = _dbConnectionFactory.CreateConnection())
        {
            using (var multi = dbConnection.QueryMultiple("DashboardSP", new { username = username }, commandType: CommandType.StoredProcedure))
            {
                ReturnObject  = multi.Read<InternalObjects.FamilyDashboard>().SingleOrDefault();
                ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable();

            }
        }
        return ReturnObject;
    }

Mon DTO:

public class InternalObjects
{
    public class FamilyDashboard
    {
        public string physicalAddress1 { get; set; }
        public string MailingAddress1 { get; set; }
        public string physicalAddressCity { get; set; }
        public string physicalAddressZip { get; set; }
        public string MailingAddressCity { get; set; }
        public string NumInHousehold { get; set; }
        public string capidCounty { get; set; }
        public string physicalUnit { get; set; }
        public string mailingUnit { get; set; }
        public string familyPhone { get; set; }
        public string capCharacteristics { get; set; }
        public IEnumerable<Person> familymembers {get; set;}

    }
    public class Person
    {
        public int Id { get; set; }
        public string firstName { get; set; }
        public string lastName { get; set; }
        public string middleName { get; set; }
        public int gender { get; set; }
        public DateTime birthdate { get; set; }
        public string emailPersonal { get; set; }
        public string SSN { get; set; }
        public string relationshipName { get; set; }
        public string primaryLanguageName { get; set; }

        public int age { get; set; }

    }
}

Réponse populaire

J'ai trouvé la réponse:

Fondamentalement, dapper ne retourne aucune valeur si aucune ligne n'est retournée, ce qui n'instancie pas mon objet. Mon objet parent, ReturnObject , n'était pas instancié, mais s'exécutait toujours correctement.

La ligne suivante ReturnObject.familymembers = multi.Read<InternalObjects.Person>().AsQueryable() tente d'accéder à l'objet, mais le DTO n'existe pas.

Un simple conditionnel sauve la journée:

if (ReturnObject != null)
{
    ReturnObject.familymembers = multi.Read<InternalObjects.Person>().ToList<InternalObjects.Person>();
}

Références pour toute autre personne qui rencontre le même!

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

Obtenir Dapper pour renvoyer une chaîne vide au lieu d'une chaîne vide




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