Dapper将单个记录映射到父母和孩子

时间:2014-06-10 03:17:20

标签: c# .net dapper

我想使用Dapper将扁平行映射到简单的父/子对象 我不确定如何做到这一点,这是一个简单的表格,查询和要映射的类的例子。

项目表
id,name,status_a,status_b,status_c

状态表
id,description

查询

select   
    prj.id,   
    prj.name,   
    a.description,  
    b.description,   
    c.description  
from project prj  
join status a on prj.status_a = a.id  
join status b on prj.status_b = b.id  
join status c on prj.status_c = c.id 

要映射到的类

class Project
{
    public string Name { get; set; }
    public Status Status { get; set; }
}

class Status
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
}

1 个答案:

答案 0 :(得分:1)

看起来你需要使用Multi Mapping。

sqlConnection.Query<Project, Status, Project>(yourQueryString, 
     (project, status) => {
          project.Status = status;
          return project;
     },
     splitOn: "description");

或类似的东西。我还没有测试过这个代码,但这是基本的想法。

sqlConnection.Query基本上告诉Dapper你的sql查询将返回两个对象(Project和Status)。这是通用参数中的前两种类型推断的。第三个(Project)告诉Dapper这个Dapper调用应该最终返回一个Project。

第一个参数将是您的查询,就像正常一样。 第二个参数是一些函数,它将从您的查询中接收项目和状态,并期望您返回一个项目对象。在这里,我们只是将状态分配给项目的状态属性。

splitOn让你告诉Dapper&#34; sql查询中的哪一点做&#34; Project&#34;对象结束和&#34;状态&#34;对象开始。

select   
prj.id,   
prj.name,   
a.description,  
b.description,   
c.description  
from project prj  
join status a on prj.status_a = a.id  
join status b on prj.status_b = b.id  
join status c on prj.status_c = c.id 

您可以看到您的项目对象以prj.name结尾,您的状态对象从a.description开始。