如何使用Dapper处理多个结果集与多重映射实例教程

2020-01-05 09:27:15王冬梅

让我们举一个联系和护照的例子。每个联系人只能有一个护照。让我们先想象一下这个数据库关系。

Dapper,结果集,多重映射

现在,让我们看看是否需要从数据库中检索联系人列表及其护照信息,我们如何用SQL实现这一点。

Dapper,结果集,多重映射

现在让我们看看我们的实体如何寻找联系和护照。


public class Contact
{
 public int ID { get; set; }
 public int OrganizationId { get; set; }
 public string ContactName { get; set; }

 public Passport Passport { get; set; }
}

public class Passport
{
 public int ID { get; set; }
 public int Contactid { get; set; }
 public string PassportNumber { get; set; }
}

现在让我们看看如何从数据库中检索这些相关实体,并使用更简洁的多重映射完整地填充具有相同关系的POCOs。


[HttpGet("{id}")]
public IActionResult GetContact(int id)
{
 var query = @"Select
    c.ID, c.Organizationid, c.ContactName,
    p.ID as PassPortId, p.ContactId, p.PassportNumber
    from Contacts c,
    Passports p
    where c.ID = p.ContactID
    and c.id = @id";

 // Execute the query
 var contact = dbConnection.Query<Contact, Passport, Contact>(query, MapResults, new { @id = id }, splitOn: "PassportId");

 return Ok(contact);
}

private Contact MapResults(Contact contact, Passport passport)
{
 contact.Passport = passport;
 return contact;
}

在上面的代码中,我们使用的是查询方法的重载版本,它采用多个类型。传递的类型是我们要映射的每个对象的类型参数,最后一个类型参数是表示该查询将返回的对象类型的附加参数。