Syntaxe Dapper pour le multi-mapping imbriqué

.net dapper multi-mapping

Question

    class Person
    {
        Address Addr { get; set; }
        int Age { get; set; }
    }

    class Address 
    {
        string StreetName { get; set; }
        County Cnty { get; set; }
    }

    class County
    {
         string CntyName;
         string CntyCode;
    }

Voici mon processus stocké qui remplit les données de la base de données.

    Create Procedure SpGetAllPersons
    As
    Select CntyName, CntyCode, StreetName, Age from Persons

J'ai essayé d'écrire ci-dessous la requête dapper mais obtenant une exception

    DBConn.Query<County, Address , Person, Person>
    (DomainConstants.SpGetAllPersons,
    (cnty, address, person) =>
    {
            address.Cnty = cnty;
            person.Addr = address;
            return person;
    },
    commandType: CommandType.StoredProcedure,
    splitOn: "StreetName, Age").ToList();

J'ai essayé d'utiliser le concept ci-dessous, mais il ne renvoie qu'un objet unique. J'ai besoin d'une liste de personnes.

     var sql =
    @"select 
        1 as PersonId, 'bob' as Name, 
        2 as AddressId, 'abc street' as Name, 1 as PersonId,
        3 as Id, 'fred' as Name
        ";
                var personWithAddress = connection.Query<Person, Address, Extra, Tuple<Person, Address, Extra>>
                    (sql, (p, a, e) => Tuple.Create(p, a, e), splitOn: "AddressId,Id").First();

Merci d'avance.

Réponse acceptée

Merci Mark et Bob pour avoir sauté dessus. J'ai pu résoudre le problème autrement:

    DBConn.Query(DomainConstants.SpGetAllPersons, commandType: CommandType.StoredProcedure)
    .Select(x => new Person
    {
        Addr = new Address
        {
            Cnty = new County
            {
                CntyName = x.CntyName,
                CntyCode = x.CntyCode
            },
            StreetName = x.StreetName
        },
        Age = x.Age
    }).ToList();

Réponse d'expert

Eh bien, dans l'exemple, vous ne sélectionnez qu'une seule ligne, de sorte que vous n'en retournerez jamais plus d'une. Cependant, Query<T> renvoie un IQueryable<T> . Vous appelez .First() , il n'est donc pas surprenant que vous obteniez exactement un résultat. Si vous modifiez la dernière partie de votre déclaration pour utiliser .ToList() vous obtiendrez une liste avec un élément par ligne.




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