【问题标题】:Multi mapping query with Dapper使用 Dapper 进行多映射查询
【发布时间】:2016-02-27 14:55:11
【问题描述】:

我的数据库中有这些类及其等效表:

public class Entity
{
    public int Id { get; set; }
    public List<EntityIdentifier> Identifiers { get; set; }

    public BaseEntity()
    {
        Identifiers = new List<EntityIdentifier>();
    }
}

public class EntityIdentifier
{
    public int Id { get; set; }
    public int EntityId { get; set; }

    public string Code { get; set; }
    public string Value { get; set; }
}

我想用 Dapper 查询数据库并自动映射数据。

我有这个多重映射的例子,来自Dapper git page

var sql = 
@"select * from #Posts p 
left join #Users u on u.Id = p.OwnerId 
Order by p.Id";

var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post;});
var post = data.First();

post.Content.IsEqualTo("Sams Post1");
post.Id.IsEqualTo(1);
post.Owner.Name.IsEqualTo("Sam");
post.Owner.Id.IsEqualTo(99);

但是,在此示例中,每个子项(帖子)都有一个指向其父项(用户)的链接。 在我的例子中,它是指向子(标识符)的 list 的父(实体)。

我需要如何根据我的情况调整代码?


这是我正在使用的 SQL 查询:

SELECT e.*, i.*
FROM Entity e INNER JOIN EntityIdentifier i ON i.EntityId = e.Id

【问题讨论】:

  • 您执行什么查询来提取 Entity 和 EntityIdentifier 表之间的连接数据?
  • @Steve 就在这里

标签: c# sql .net sql-server dapper


【解决方案1】:

这是我在 Dapper 相关网站某处找到的示例。这里的重点是有一个字典,您将 Entity.ID 作为键,将实体作为字典值。然后在 lambda 表达式中检查字典是否已经包含实体,如果是,只需将 EntityIdentifier 添加到实体列表中,否则将 Dapper 返回的实体添加到字典中

string cmdText = @"SELECT e.*, i.*
                   FROM Entity e INNER JOIN Identifier i ON i.EntityId = e.Id";
var lookup = new Dictionary<int, Entity>();
using (IDbConnection connection = OpenConnection())
{
    var multi = connection.Query<Entity, EntityIdentifier, Entity>(cmdText, 
                                (entity, identifier) =>
    {
        Entity current;
        if (!lookup.TryGetValue(entity.ID, out current))
        {
            lookup.Add(entity.ID, current = entity);
            current.Identifiers = new List<EntityIdentifier>();
        }
        current.Identifiers.Add(identifier);
        return current;
    }, splitOn: "i.ID").Distinct();
    return multi;
}

有时这会因参数 splitOn 而变得复杂。不知道你是否需要重复它显式添加到 Select 语句(我通常使用 IDTable 模式)

【讨论】:

  • 谢谢我正在做测试,很快就会尝试你的提议
  • 我最终使用了 this post 的大量修改版本,使用带有类型数组的查询,因为在我的实际用例中(这个问题被简化了很多)我有超过 7 个要映射的类...
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 2012-03-30
  • 2013-05-03
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
相关资源
最近更新 更多