c# - 如何在具有三级深度映射的 Dapper 中创建多映射查询?

标签 c# dapper

我正在尝试执行正确映射以下内容的查询:

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/

相关文章:

c# - 使用 Dapper 启用多个事件结果集

c# - 比较 Dapper 中的 QUERY 和 EXECUTE

c# - 如何检查字符串是否不等于多个字符串

c# - 如何接受 HTTP 400 和 HTTP 500 作为 Visual Studio 负载测试中的有效响应代码?

c# - 使用绘制事件移动对象

cqrs - 在 CQRS 中将 MicroORM 用于读取层

c# - 使用 dapper 创建 ids 约定

c# - 如何将 winforms 对话框附加到现有的工具栏/菜单栏(已编译的 C++ 应用程序)?

c# - 在 C# 中如何旋转图片框及其图像?

c# - 如何使用 Dapper-Extensions 自动绑定(bind)下划线表/列名称?