c# - 使用 Dapper 映射嵌套对象列表

标签 c# .net wpf orm dapper

我正在使用 Dapper,我有这样的类:

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

我可以获得有关文章的所有信息,但我想知道是否可以通过一次查询获取每篇文章的条形码列表。其实我做的是这样的:

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

我也找到了很好的解释here但我不明白如何在我的案例中使用它,因为我也有 Group 类。 我应该如何使用 Dapper 执行此操作,是否可能或唯一的方法是执行不同的步骤? 谢谢

最佳答案

QueryMultiple 是你的 friend

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

这可能并不有趣,尤其是当您的查询中没有任何过滤器时。但我怀疑你会退回所有文章。在这种情况下,您可以像这样过滤条形码(已编辑的 sql)> select * from Barcode where Id in @ids。然后在 QueryMultiple 中包含参数 ids(文章 ID 列表)。

选项2

或者你可以做单独的查询:

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

我更喜欢第一个选项。

关于c# - 使用 Dapper 映射嵌套对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32007238/

相关文章:

c# - Entity Framework - 同时执行多个查询时出错

c# - 如何选择带触发器的DataTemplate?

c# - 从 WPF Windows 应用程序到实际控制台的输出 Console.WriteLine

c# - 在内核中绑定(bind)时的 ToConstant

c# - Moq >= 4.5.7 在 It.IsAny<decimal>() 上公开异常

c# - 在 C# 中将 Xml 反序列化为对象

.net - 减少从网络驱动器运行的 .NET Windows 窗体应用程序的启动时间

c# 不一致的可访问性阻止私有(private)类作为 protected 方法的参数

.net - 将 MIME 树转换为 MailMessage

c# - WPF 中的动态工具提示