簡體   English   中英

如何使用 Dapper 查詢具有一對多關系的對象?

[英]How to query an object with one-to-many relationship using Dapper?

我有(顯然是簡化的)表格,例如:

public class Father
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Son> Sons { get; set; } = new List<Son>();
}

public class Son
{
    [Key]
    public int Id { get; set; }
    public int FatherId { get; set; }
    public string Name { get; set; }
}

在數據庫中,我有 1 個 ID = 1 的父親和 3 個父親 ID = 1 的兒子。

我有這樣的查詢:

conn.Query<Father, Son, Father>(
    @"SELECT f.*, s.* FROM Father f INNER JOIN Son s ON f.Id = s.FatherId WHERE f.Id = 1", 
    (f, s) => 
    {
        f.Sons.Add(s);
        return f;
    },
);

上面的查詢為我提供了 3 個父親的 IEnumerable,每個父親都包含一個兒子,而不是我想要的:一個具有包含 3 個兒子對象的 Sons 屬性的父親對象。

我可以通過這樣做來做到這一點,但我不確定這是否是最好的方法:

// Get father
var father = await connection.GetAsync<Father>(id);
// Get related sons
var sql = $"SELECT * FROM Son a WHERE a.FatherId = {father.Id}";
var sons = (await connection.QueryAsync<Address>(sql)).AsList();
// Stitch em all together
father.Sons.AddRange(sons);

我想知道這是否是最好的方法。 我們如何使用 Dapper 獲取包含所有相關對象的單個對象?

有一些方法可以做到這一點,請參閱如何在 Dapper.Net 中編寫一對多查詢?

我更願意這樣做:

var fatherDictionary = new Dictionary<int, Father>();

var list = connection.Query<Father, Son, Father>(
    @"SELECT f.*, s.* FROM Father f INNER JOIN Son s ON f.Id = s.FatherId WHERE f.Id = 1",
    (f, s) =>
    {
        Father fatherEntry;

        if (!fatherDictionary.TryGetValue(f.Id , out fatherEntry))
        {
            fatherEntry = f;
            fatherEntry.Sons = new List<Son>();
            fatherDictionary.Add(fatherEntry.Id, fatherEntry);
        }

        fatherEntry.Sons.Add(s);
        return fatherEntry;
    })
.Distinct()
.ToList();

參見示例: https : //dapper-tutorial.net/result-multi-mapping#example-query-multi-mapping-one-to-many

暫無
暫無

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

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