如何使用 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 个 FatherId = 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 个儿子对象。
我可以这样做,但我不确定这是否是最好的方法:
// 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 获取包含所有相关对象的单个对象?
有一些方法可以做到这一点,请参阅 How do I write one to many query in 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
我有(显然是简化的)表格,例如:
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 个 FatherId = 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 个儿子对象。
我可以这样做,但我不确定这是否是最好的方法:
// 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 获取包含所有相关对象的单个对象?
有一些方法可以做到这一点,请参阅 How do I write one to many query in 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