如何根据C#中的Ids填充嵌套列表中的数据?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何根据C#中的Ids填充嵌套列表中的数据?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2331字,纯文字阅读大概需要4分钟。
内容图文
![如何根据C#中的Ids填充嵌套列表中的数据?](/upload/InfoBanner/zyjiaocheng/775/b0f5782c65fe44faa80c5f7e23b701a8.jpg)
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>汽车每辆车都已列出政策清单< PolicySummaryDTO> PolicySummaries.
PolicyId已填满.但其他属性如PolicyName,Amount等则不是.
我需要做的是从DB _contex.PolicySummary获取数据,我需要完成缺少的字段.
我知道我可以这样做.
>获取所有PolicyIds
var policyIds = cars.SelectMany(t => t.PolicySummaries).Select(r => r.PolicyId);
>根据ID获取PolicyData
var policyData = _context.PolicySummary.Where(t => policyIds.Contains(t.PolicyId));
>然后使用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;
}
}
Everthing工作正常,但我想知道我是否能以更优雅的方式做到这一点,也许以某种方式使用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;
}
}
解决方法:
首先,为什么数据没有填写?您应该能够在使用.Include从DB中实际取车期间填写任何相关实体中的数据.
var carEntity = _context.Cars.Where(predicate).Include(c => c.PolicySummaries).Single();
其次,您的代码存在严重的性能问题:policyData是IQueryable.每次执行policyData.Single时,都会向数据库发送一个新查询,查看所有策略,过滤那些在policyIds中具有其ID的策略并选择适当的策略.如果有许多策略,这将是非常低效的 – 每个foreach迭代都是一个新查询!你应该做的事情可能是这样的:
var policyData = _context.PolicySummary.Where(t => policyIds.Contains(t.PolicyId)).ToList();
获取所有相关政策.如果存在大量共享策略并且最终在某些时候最终加载大部分策略,这也可能效率低下,因此如果数据库中没有十亿个策略:
var policies = _context.PolicySummary.ToList();
可以更好地工作.这是时间/内存权衡,但请注意,上述任何一个都比当前的查询超载更好.
内容总结
以上是互联网集市为您收集整理的如何根据C#中的Ids填充嵌套列表中的数据?全部内容,希望文章能够帮你解决如何根据C#中的Ids填充嵌套列表中的数据?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。