简体   繁体   English

如何使用 Dapper.net 映射同一个表中的多个对象?

[英]How to map multiple objects from the same table with Dapper.net?

I have two SQL tables: Teams and Members.我有两个 SQL 表:团队和成员。 Each team contains 3 members, in the database the members' ids are stored.每个团队包含 3 名成员,在数据库中存储成员的 ID。

Sample Database示例数据库

How could I map the Member objects into the Teams using the Dapper.NET ORM?如何使用 Dapper.NET ORM 将成员对象映射到团队?

public class Team
{
    public int? id { get; set; }
    public Member MemberA { get; set; }
    public Member MemberB { get; set; }
    public Member MemberC { get; set; }
}

public class Member
{
    public int? id { get; set; }
    public string Name { get; set; }
}



public IEnumerable<Team> GetTeams()
{
    string sql = "SELECT * FROM Teams t LEFT JOIN Members m ON t.MemberA=m.id AND t.MemberB=m.id AND t.MemberC=m.id";

    return m_connection.Query<Team, Member, Member, Member, Team>(sql, (t, m1, m2, m3) =>
    {
        t.MemberA = m1;
        t.MemberB = m2;
        t.MemberC = m3;

        return t;
    }, splitOn: "MemberA,MemberB,MemberC");
}

You need to fix your sql query to have a proper join with the Members Table.您需要修复您的 sql 查询以正确连接成员表。

Just change it to只需将其更改为

string sql = @"SELECT t.ID, t.MemberA, m1.Id, m1.Name, 
                            t.MemberB, m2.Id, m2.Name, 
                            t.MemberC, m3.Id, m3.Name
               FROM Teams t LEFT JOIN Members m1 ON t.MemberA=m1.id 
                            LEFT JOIN Members m2 ON t.MemberB=m2.id
                            LEFT JOIN Members m3 ON t.MemberC=m3.id";

and your dapper code will work as you expect filling the three Member instance of every single Team retrieved.并且您的 dapper 代码将按照您期望的方式工作,填充检索到的每个团队的三个 Member 实例。

Notice that when you use multimapping, you need to place the SplitOn elements in the proper place to have Dapper understand your requirement to create three different Member variables.请注意,当您使用多重映射时,您需要将 SplitOn 元素放置在适当的位置,以使 Dapper 了解您创建三个不同成员变量的要求。

Version for MS-Access MS-Access 版本

string sql = @"SELECT t.ID, t.MemberA, m1.Id, m1.[Name], 
                            t.MemberB, m2.Id, m2.[Name], 
                            t.MemberC, m3.Id, m3.[Name]
               FROM (((Teams t LEFT JOIN Members m1 ON t.MemberA=m1.id) 
                            LEFT JOIN Members m2 ON t.MemberB=m2.id)
                            LEFT JOIN Members m3 ON t.MemberC=m3.id)";

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM