小巧的地图属性

时间:2016-06-22 12:41:13

标签: c# dapper

您好我有以下课程(简化)我希望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如何映射它?

1 个答案:

答案 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实例。

(我无法直接使用“地址”字段进行拆分,并且很想知道是否有办法在没有假字段的情况下执行此操作)