2016-06-01 103 views
2

比方说,我有存储在我的数据库中呈扁平状的接触,这样我询问他们是这样的:小巧玲珑多映射两个相同类型的属性

SELECT Name, HomeHouseNumber, HomePostcode, WorkHouseNumber, WorkPostcode FROM Contacts 

我想多一点的结构,我C#代码,并具有与家庭和工作地址联系的简单定义。

class Address 
{ 
    public string HouseNumber { get; set; } 
    public string Postcode { get; set; } 
} 

class Contact 
{ 
    public string Name { get; set; } 
    public Address HomeAddress { get; set; } 
    public Address WorkAddress { get; set; } 
} 

我发现我可以使用多映射不通过走样列在选择这样提取的家庭住址:

IEnumerable<Contact> GetContacts() 
{ 
    return Connection.Query<Contact, Address, Address, Contact>(
     "SELECT Name, HomeHouseNumber as HouseNumber, HomePostcode as Postcode, WorkHouseNumber, WorkPostcode FROM Contacts", 
     (contact, home, work) => 
     { 
      contact.HomeAddress = home; 
      contact.WorkAddress = work; 
      return contact; 
     }, 
     splitOn: "HouseNumber,WorkHouseNumber"); 
} 

但是我不能别名以这样的方式工作地址栏他们将被映射。 Dapper可以为我执行这个映射吗?还是我必须手动执行这个映射?

回答

3

令人难以置信的是,解决方案是为列提供相同的别名。我不认为SQL会允许这样做,但它确实和Dapper完全一致。

IEnumerable<Contact> GetContacts() 
{ 
    return Connection.Query<Contact, Address, Address, Contact>(
     "SELECT Name, HomeHouseNumber as HouseNumber, HomePostcode as Postcode, WorkHouseNumber as HouseNumber, WorkPostcode as Postcode FROM Contacts", 
     (contact, home, work) => 
     { 
      contact.HomeAddress = home; 
      contact.WorkAddress = work; 
      return contact; 
     }, 
     splitOn: "HouseNumber,HouseNumber"); 
}