gpt4 book ai didi

c# - 如何在 C# 中根据 ID 向嵌套列表中填充数据?

转载 作者:行者123 更新时间:2023-11-30 12:38:29 24 4
gpt4 key购买 nike

public class CarDTO
{
public int CarId { get; set; }
public string CarName { get; set; }
public List<PolicySummaryDTO> PolicySummaries { get; set; }
}

public class PolicySummaryDTO
{
public long PolicyId { get; set; }
public string PolicyName { get; set; }
public decimal Amount { get; set; }
}

我有 List<CarDTO> Cars每辆车都有政策 list List<PolicySummaryDTO> PolicySummaries . PolicyId充满。但其他属性如 PolicyName , Amount等都不是。我需要做的是从数据库中获取数据 _contex.PolicySummary我需要填写缺失的字段。

我知道我可以用这种方式做到这一点。

  1. 获取所有 PolicyId var policyIds = cars.SelectMany(t => t.PolicySummaries).Select(r => r.PolicyId);

  2. 根据 ID 获取 PolicyData var policyData = _context.PolicySummary.Where(t => policyIds.Contains(t.PolicyId));

  3. 然后使用 foreach 我可以填充数据。

    foreach (var car in cars)
    {
    foreach (var policy in car.PolicySummaries)
    {
    var policyDataToUse = policyData.Single(t => t.PolicyId == policy.PolicyId);
    policy.Amount = policyDataToUse.Amount;
    policy.PolicyName = policyDataToUse.PolicyName;
    }
    }

一切都会正常工作,但我想知道我是否可以用更优雅的方式来做,也许以某种方式使用 LINQ JOIN或者什么,或者也许我的解决方案是完全正确的?


编辑 - 用字典解决

var policyIds = cars.SelectMany(t => t.PolicySummaries).Select(r => r.PolicyId);
var policyDict = _context.PolicySummary.Where(t => policyIds.Contains(t.PolicyId)).ToDictionary(t => t.PolicyId);

foreach (var car in cars)
{
foreach (var policy in car.PolicySummaries)
{
var policyDataToUse = policyDict[policy.PolicyId];
policy.Amount = policyDataToUse.Amount;
policy.PolicyName = policyDataToUse.PolicyName;
}
}

最佳答案

那么首先,为什么数据没有填充呢?您应该能够在实际 Car 期间在任何相关实体中填写数据使用 .Include 从数据库中获取.

var carEntity = _context.Cars.Where(predicate).Include(c => c.PolicySummaries).Single();

其次,您的代码存在严重的性能问题:policyData是一个 IQueryable .每次你做policyData.Single ,您向数据库发送一个新查询,查看所有策略,过滤具有 id 的策略在 policyIds并选择合适的。如果有很多策略,这将是非常低效的——每个 foreach迭代是一个新的查询!你应该做的可能是做这样的事情:

var policyData = _context.PolicySummary.Where(t => policyIds.Contains(t.PolicyId)).ToList();

获取所有相关政策。如果有很多共享策略并且你最终会在某个时候加载其中的大部分策略,这也可能是低效的,所以如果数据库中没有十亿个策略:

var policies = _context.PolicySummary.ToList();

可以做得更好。这是时间/内存的权衡,但请注意,以上任何一项都比当前的查询过载更好 foreach你有。

关于c# - 如何在 C# 中根据 ID 向嵌套列表中填充数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51836541/

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