簡體   English   中英

使用Dapper進行多重映射查詢

[英]Multi mapping query with Dapper

我的數據庫中有這些類及其等效表:

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頁面上有這個多重映射的例子:

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

但是,在此示例中,每個子項(帖子)都有指向其父項(用戶)的鏈接。 在我的情況下,是父項(實體)指向子項列表 (標識符)。

我該如何調整代碼以適應我的情況?


這是我正在使用的SQL查詢:

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

這是我在Dapper相關網站上找到的一個示例。 這里的重點是要有一個字典,您可以在其中保留Entity.ID作為鍵,而Entity作為字典值。 然后在lambda表達式中檢查字典是否已經包含Entity,如果是,則將EntityIdentifier添加到Entity列表,否則將Dapper返回的Entity添加到Dictionary

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模式)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM