使用 Dapper 映射嵌套对象列表
Map lists of nested objects with Dapper
我正在使用 Dapper,我有 class这样的:
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 但我不明白如何在我的案例中使用它,因为我也有组 class。
我应该如何使用 Dapper 执行此操作,是否可能或唯一的方法是执行不同的步骤?
谢谢
QueryMultiple 是你的朋友
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();
}
}
}
这可能并不有趣,尤其是当您的查询中没有任何过滤器时。但我怀疑你会 return 所有文章。在这种情况下,您可以像这样过滤条形码(已编辑 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);
}
我更喜欢第一个选项。
我正在使用 Dapper,我有 class这样的:
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 但我不明白如何在我的案例中使用它,因为我也有组 class。 我应该如何使用 Dapper 执行此操作,是否可能或唯一的方法是执行不同的步骤? 谢谢
QueryMultiple 是你的朋友
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();
}
}
}
这可能并不有趣,尤其是当您的查询中没有任何过滤器时。但我怀疑你会 return 所有文章。在这种情况下,您可以像这样过滤条形码(已编辑 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);
}
我更喜欢第一个选项。