【问题标题】:How to map multiple objects from the same table with Dapper.net?如何使用 Dapper.net 映射同一张表中的多个对象?
【发布时间】:2019-12-20 20:32:45
【问题描述】:

我有两个 SQL 表:Teams 和 Members。每个团队包含 3 名成员,在数据库中存储成员的 ID。

Sample Database

如何使用 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");
}

【问题讨论】:

  • 你的团队不应该有List&lt;Member&gt;吗?
  • 这更像是一个 Sql 语法问题,而不是 Dapper 问题
  • @stuartd 不,这不是一对多的关系。

标签: c# sql join dapper


【解决方案1】:

您需要修复您的 sql 查询以与成员表正确连接。

改成

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

您的简洁代码将按照您预期的方式工作,填充检索到的每个 Team 的三个 Member 实例。

请注意,当您使用多重映射时,您需要将 SplitOn 元素放置在适当的位置,以便 Dapper 了解您创建三个不同成员变量的要求。

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)";

【讨论】:

  • 这个 sql 表达式是否也适用于 OleDbConnection?因为我遇到了语法错误。
  • 你用的是什么数据库?
  • MS Access 数据库
  • 可能是标题为 Name 的列。它是 MS-Access 中的保留关键字。尝试使用 m1.[Name]....,m2.[Name],...,m3.[Name]
  • 将查询粘贴到 Access 中,它应该会告诉您它不喜欢什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 2011-06-23
  • 1970-01-01
  • 2023-03-09
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多