Dapper-Syntax für geschachtelte Multi-Mapping

.net dapper multi-mapping

Frage

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

Hier ist mein Stored Proc, der die Daten aus der Datenbank auffüllt.

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

Ich habe versucht, unter Dapper Abfrage schreiben, aber eine Ausnahme bekommen

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

Ich habe versucht, unter Konzept zu verwenden, aber es gibt nur einzelnes Objekt zurück. Ich brauche eine Liste von Personen.

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

Danke im Voraus.

Akzeptierte Antwort

Danke, Mark und Bob, dass du darauf gesprungen bist. Ich konnte das Problem anders lösen:

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

Expertenantwort

Nun, im Beispiel Sie die Auswahl nur eine einzige Zeile, so dass nicht immer mehr als eine Rückkehr. Query<T> gibt jedoch ein IQueryable<T> . Sie rufen .First() , so ist es nicht verwunderlich, dass Sie genau ein Ergebnis erhalten. Wenn Sie den letzten Teil Ihrer Anweisung ändern, um .ToList() Sie eine Liste mit einem Element pro Zeile.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum