您好我有以下课程(简化)我希望dapper映射到
Member.cs
public string FirstName { get; set; }
public string LastName { get; set; }
public Place Address { get; set; }
Place.cs
public string Address{ get; set; }
public string City { get; set; }
public string PostalZip { get; set; }
我从SQL服务器获得的响应如下:
Id FirstName LastName AddressAddress AddressCity
-----------------------------------------------------------------------------
113 First Last Some Address Some City
执行此操作时:
var members = session.Connection.Query<Member>(dataQuery, p, transaction).ToList();
它映射了成员部分就好了,但是成员(place.cs)上的Address属性仍然没有映射,如何告诉dapper如何映射它?
答案 0 :(得分:1)
假设PostalZip不是Place类型,但可能是一个简单的字符串,那么您的Dapper查询可以作为
using (IDbConnection connection = OpenConnection())
{
string query = @"SELECT Id,FirstName,LastName,
0 as splitterID, Address, City, PostalZip
FROM Members";
var result = connection.Query<Member, Place, Member>(query, (mb, pl) =>
{
mb.Address = pl;
return mb;
},
splitOn: "splitterID");
}
此查询将Members
表的所有记录返回到IEnumerable<Member>
变量。 IEnumerable(成员)的每个元素都将其地址字段设置为从记录的第二部分提取的具有地址,城市和邮政编码的地方。
诀窍在于传递给Query方法的lambda表达式。在这里,我们声明它是一个Func从Dapper内部接收一个成员和一个地方返回一个成员。
Dapper库了解在找到由参数splitterID
定义的假字段splitOn
时创建Place类型实例的需要,并将此实例与Member实例一起传递给lambda。
lambda表达式将Place实例分配给Member实例的属性Address,并返回正确初始化的相同Member实例。
(我无法直接使用“地址”字段进行拆分,并且很想知道是否有办法在没有假字段的情况下执行此操作)