2014-09-18 54 views
0

我正在试图用Dapper(和失败)做以下事情。我如何获得多映射在Dapper中工作?

我的波苏斯(简化所有代码)是:

public class Company 
    { 
     public int CompanyId { get; private set; } 
     public string CompanyName { get; private set; } 
     public Person CompanyAddress { get; private set; } 
     public Person Administrator { get; private set; } 
} 
    public class Person 
    { 
     public int PersonId { get; private set; } 
     public string FirstName { get; private set; } 
     public string LastName { get; private set; } 
} 

在公司表有一个公司地址FK它映射,将personId PK Person表中的数据库和管理员。基于thisthis我认为follwoing是我要如何做到这一点:

public static Company Select(IDbConnection connection, int id) 
{ 
    Trap.trap(); 
    return connection.Query<Company, Person, Person, Company>("select * from Company left join Person address on Company.CompanyAddress = address.PersonId left join Person admin on Company.Administrator = admin.PersonId where Company.CompanyId = @Id", 
     (cmpy, addr, admin) => new { PersonId = id }).FirstOrDefault(); 
} 

但是,这给了我一个编译错误的“新{PERSONID = ID}”。我错了什么?

回答

1

您需要提供SplitOn参数来指定下一个表/类的起始位置。你也应该不是创建一个匿名类型,但使用新的范围,以初始化的CompanyAdministrator属性:

string sql = @"select c.CompanyId,c.CompanyName, c.CompanyAddress, 
         address.PersonId, etc. .... 
       from Company c 
       left join Person address 
        on Company.CompanyAddress = address.PersonId 
       left join Person admin 
        on Company.Administrator = admin.PersonId 
       where Company.CompanyId = @Id"; 
string splitOn = "PersonId"; // maybe two parameters separated by comma, see comment below the answer 
return connection.Query<Company, Person, Person, Company>(sql, 
    (Company cmpy, Person addr, Person admin) => { cmpy.Administrator = admin; return cmpy; } 
    ,null,null,true,splitOn) 
    .FirstOrDefault(); 

不过,我不知道,因为你有两个连接到同一个表的作品了。所以我认为你需要所有重复列的别名,如PersonId。但是这个迁移无论如何都有帮助。

+0

这给出了@Id需要定义的错误。我放弃了Dapper,我花了更多的时间试图让这个工作,而不是仅仅处理选择自己。并用尽你的时间 - 对不起。 – 2014-09-19 14:57:03