Listas de mapas de objetos anidados con Dapper

.net c# dapper orm wpf

Pregunta

Estoy usando Dapper y tengo clases como esta:

public class Article{
   public int Id { get; set; }
   public string Description{get;set;}
   public Group Group { get; set; }
   public List<Barcode> Barcode {get;set;}
   ...
}

public class Group{
   public int Id { get; set; }
   public string Description {get;set;}
}

public class Barcode{
   public int Id { get; set; }
   public string Code{get;set;}
   public int IdArticle { get; set; }
   ...
}

Puedo obtener toda la información sobre el artículo pero me gustaría saber si es posible con una consulta obtener también la lista de códigos de barras para cada artículo. En realidad, lo que hago es esto:

string query = "SELECT * FROM Article a " +
"LEFT JOIN Groups g ON a.IdGroup = g.Id ";

arts = connection.Query<Article, Group, Article>(query,
    (art, gr) =>
    { art.Group = gr;  return art; }
    , null, transaction).AsList();

También encontré una buena explicación aquí, pero no entiendo cómo usarla en mi caso, porque también tengo la clase grupal. ¿Cómo debo hacer esto con Dapper, es posible o la única forma es hacer diferentes pasos? Gracias

Respuesta aceptada

QueryMultiple es tu amigo

var query = @"
select a.*, g.* from Article a left join Groups g on g.Id = a.IdGroup    
select * from Barcode";
//NOTE: IdGroup should exists in your Article class.
IEnumerable<Article> articles = null;
using (var multi = connection.QUeryMultiple(query)){
    articles = multi.Read<Article, Group, Article>((a, g)=>
            { a.Group = g; return a; });
    if (articles != null) {
      var barcodes = multi.Read<Barcode>().ToList();
      foreach(var article in articles){           
        article.Barcode = barcodes.Where(x=>x.IdArticle = article.Id).ToList(); 
      }
    }
}

Eso puede no ser divertido, especialmente si no tiene filtros en su consulta. Pero dudo que devuelva todos los artículos. En ese caso, puede filtrar el código de barras de esta manera (sql editado)> select * from Barcode where Id in @ids . A continuación se incluye el parámetro ids (una lista de Artículo IDS) en el QueryMultiple.

Opcion 2

O simplemente puede hacer consultas por separado:

var query = "select a.*, g.* from Article a left join Groups g on g.Id = a.IdGroup";
var articles = connection.Query<Article, Group, Article>(query,
    (a,g)=> { a.Group = g; return g; }).ToList();
query = "select * from Barcode where IdArticle IN @articleIds";
var articleIds = articles.Select(x=>x.Id);
var barcodes = connection.Query<Barcode>(query, new { articleIds });
foreach(var article in articles){           
    article.Barcode = barcodes.Where(x=>x.IdArticle = article.Id);
}

Prefiero la primera opción.



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é