我正在尝试执行正确映射以下内容的查询:
public class A
{
public int Id { get; set; }
public string Name { get; set; }
public int BId {get; set; }
public List<B> { get; set; }
}
public class B
{
public int Id { get; set; }
public string Name { get; set; }
public int CId { get; set; }
public int DId { get; set; }
public C C { get; set; }
public D D { get; set; }
}
public class C
{
public int Id { get; set; }
public string Name { get; set; }
}
public class D
{
public int Id { get; set; }
public string Name { get; set; }
}
如何编写一个查询来正确映射实体 A 和填充了 C 和 D 的实体 B 列表?
最佳答案
您想在这里执行两个查询,以捕获 B 在 A 上的一对多性质。此外,您的 B 可能需要在查询中返回对 A 的引用。
var query1 = conn.Query<A>(select * from dbo.A)
var query2 = conn.Query<B,C,D,B>("select * from dbo.B...join C...join
D",(b,c,d)=>{
b.C = c;
b.D = d;
return b;
}
现在您必须将它们连接在一起。我使用 linq 连接和扩展来自动化一堆它,但要点是,遍历每个“A”并从查询 2 中找到匹配的“B”。字典和列表也可能比“Where”子句更快,所以你可以写一个扩展来优化下面的循环。
foreach(var a in query1){
a.Bs = query2.Where(w=>w.AId.Equals(a.Id));
}
请注意,您可以通过使用 QueryMultiple 返回多个记录集(如果您的数据库支持)来减少访问数据库的次数。
关于c# - 如何在具有三级深度映射的 Dapper 中创建多映射查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38861878/