【发布时间】:2020-11-07 22:57:51
【问题描述】:
我有一个包含 10 个元素的列表(假设 List<TestObj> resultList),并且我有计数为 7039 的 IQueryable(假设名称为 resultQueryable)。我尝试运行以下代码:
foreach (var listItem in resultList)
{
listItem.Amount = resultQueryable.FirstOrDefault(r => r.Id == listItem.Id).Amount;
}
但是 foreach 代码花费了大量时间,因为 resultQueryable 存储 7039 元素并且 FirstOrDefault 方法返回结果太晚了。我该怎么做才能获得良好的性能?
【问题讨论】:
-
发生了两件事:1) 您正在以非预期的方式重用数据库上下文。有一些选项可以调整性能:创建新上下文和禁用跟踪。 2)您应该能够从 1 个查询中获取数据 - 这应该会显着提高性能。
-
请分享minimal reproducible example。如果你不想这样做,你应该
ToDictionaryresultQueryablebefore 循环。将 ID 作为键,然后在循环内对字典使用TryGetValue。您的代码按原样为resultList中的每个条目执行数据库查询。
标签: c# asp.net .net linq asp.net-core