gpt4 book ai didi

c# - 使用 Dapper 或通过 Linq 填充一对多关系

转载 作者:太空狗 更新时间:2023-10-29 22:15:51 24 4
gpt4 key购买 nike

实体 - AllSalesTerritory包含 List<MySalesPerson>代表一对多关系。我有Sql查询以使用列 TerritoryId 获取两个实体映射的数据.我使用以下代码使用 Dapper micro ORM 填充实体:

 List<AllSalesTerritory> allSalesTerrotories = _connection.Query<AllSalesTerritory, MySalesPerson, AllSalesTerritory>
(query, (pd, pp) =>
{
pd.SalesPersons.Add(pp);
return pd;
}, splitOn: "BusinessEntityId")
.ToList();

BusinessEntityId是执行Sql语句时SalesPerson实体的起始列

我面临的挑战是,这种代码有助于轻松填充一对一关系,这里我在每个 List<MySalesPerson> 中只得到一个值。 ,而不是在集合中聚合这些值,本质上与 SQL 连接查询的结果相同。我可以使用简单的 foreach 轻松解决问题循环并聚合 MySalesPerson 的值.但是,我想弄清楚:

  1. Dapper 能自动帮我实现吗,尝试了几个扩展,但没有达到预期的效果
  2. Linq 代码可以为我完成吗,因为这与 SelectMany 有点相反在具有一对多关系的实体上

最佳答案

您可以使用字典来跟踪唯一的 AllSalesTerritory 对象。假设 TerritoryId 属性是一个 int 这会起作用。

var territories = new Dictionary<int, AllSalesTerritory>()
_connection.Query<AllSalesTerritory, MySalesPerson, AllSalesTerritory>
(query, (pd, pp) =>
{
AllSalesTerritory territory;
if(!territories.TryGetValue(pd.TerritoryId, out territory))
{
territories.Add(pd.TerritoryId, territory = pd);
}

territory.SalesPersons.Add(pp);
return territory;
}, splitOn: "BusinessEntityId");

List<AllSalesTerritory> allSalesTerrotories = territories.Values.ToList();

基本上,这里发生的是 Dapper 将为查询结果中的每一行返回一个 AllSalesTerritory 和一个 MySalesPerson。然后,我们使用字典根据 TerritoryId 查看当前的 AllSalesTerritory (pd)。如果是这样,则本地 territory 变量被分配到该对象的引用。如果不是,那么我们将 pd 分配给 territory,然后将其添加到字典中。然后我们将当前的 MySalesPerson (pp) 添加到 territory.SalesPersons 列表中。

关于c# - 使用 Dapper 或通过 Linq 填充一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32828878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com