Mapeo de uno a muchos con Dapper

c# dapper one-to-many sql tsql

Pregunta

Tratando de resolver esto, pero no puedo hacer que funcione. Esta consulta:

select MultiCollections.*, Collections.* from MultiCollections 
left join MultiCollectionCollections on MultiCollections.Id = MultiCollectionCollections.MultiCollectionId
left join  Collections on MultiCollectionCollections.CollectionId = Collections.Id
where MultiCollections.UserId=5

Esto devolverá estos datos:

enter image description here Como puede ver, las filas 1 y 2 son del mismo Título. La información detrás de ellos son libros. Las filas 3 y 4 también son colecciones pero no tienen libros.

Tengo dos objetos en mi código: Colección MultiCollection

Ambos corresponden con los datos dados en el resultado de la consulta: Id, UserId y Title son para el objeto MultiCollection. Otros datos son para el objeto Colección.

Espero ver tres MultiCollections en mi código C #: Action Drama Fiction

La acción tendrá 2 colecciones. Drama y Ficción deberían estar vacíos.

En cambio, obtengo 4 MultiCollections y ninguno de ellos contiene colecciones. Mi código de C #:

public IEnumerable<MultiCollection> GetAll(int userId)
    {
        string query = @"select MC.*, C.* from MultiCollections  MC
                        left join MultiCollectionCollections MCC on MC.Id = MCC.MultiCollectionId
                        left join  Collections C on MCC.CollectionId = C.Id
                        where UserId=" + userId;

        using (DbConnection connection = ConnectionFactory())
        {
            connection.Open();
            return connection.Query<MultiCollection, List<Collection>, MultiCollection>(query,
                (a, s) =>
                {
                    a.Collections = s;
                    return a;
                });
        }
    }

Cuando ejecuto el código, esperaría esto:

Action    
    Collections    
       -> Book 1    
       -> Book 2     
Drama    
   Collections    
       Null     
Fiction    
    Collections    
        Null

No tengo idea de lo que estoy haciendo mal.

Respuesta popular

Su código c # debería verse así:

public IEnumerable<MultiCollection> GetAll(int userId)
{
    string query = @"select MC.*, C.* from MultiCollections  MC
                    left join MultiCollectionCollections MCC on MC.Id = MCC.MultiCollectionId
                    left join  Collections C on MCC.CollectionId = C.Id
                    where UserId=" + userId;

    using (DbConnection connection = ConnectionFactory())
    {
        connection.Open();
        return connection.Query<MultiCollection, Collection, MultiCollection>(query,
            (a, s) =>
            {
                a.Collections = new List<Collection>();
                a.Collections.Add(s);
                return a;
            }, splitOn: "MultiCollectionId,CollectionId"););
    }
}

Observe que .Query<MultiCollection, Collection, MultiCollection> es una Collection no List<Collection> y está haciendo .add() y no establece.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué