Dapper Sintaxis para Mapeo Anidado Multi

.net dapper multi-mapping

Pregunta

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

Aquí está mi Stored Proc que rellena los datos de la base de datos.

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

Traté de escribir debajo de la consulta de Dapper pero obteniendo una excepción

    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();

Traté de usar el siguiente concepto, pero devuelve solo un objeto. Necesito una lista de personas.

     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();

Gracias por adelantado.

Respuesta aceptada

Gracias Mark y Bob por saltar sobre él. Pude resolver el problema de otra manera:

    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();

Respuesta experta

Bueno, en el ejemplo , solo está seleccionando una sola fila, por lo que nunca volverá más de una. Sin embargo, Query<T> devuelve un IQueryable<T> . Está llamando .First() , por lo que no es sorprendente que obtenga exactamente un resultado. Si cambia la última parte de su extracto para usar .ToList() , obtendrá una lista con un artículo por fila.



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