【问题标题】:How do I get multi-mapping to work in Dapper?如何让多重映射在 Dapper 中工作?
【发布时间】:2014-09-18 20:03:27
【问题描述】:

我正在尝试使用 Dapper 执行以下操作(但失败了)。

我的 POCO(所有代码均已简化)是:

    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; }
}

在数据库中,Company 表有一个用于 CompanyAddress 和 Administrator 的 FK,它映射到 Person 表中的 PersonID PK。基于thisthis 我认为以下是我想要这样做的方式:

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();
}

但这给了我一个关于“new { PersonId = id }”的编译错误。我哪里错了?

【问题讨论】:

    标签: ado.net dapper


    【解决方案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)设置一个别名。但无论如何,这可能会有所帮助。

    【讨论】:

    • 这给出了需要定义@Id 的错误。我放弃了 Dapper,我花了更多的时间试图让它工作,而不是自己处理选择。也浪费了你的时间 - 对不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多