C# 如何从FirstOrDefault方法获得性能良好的结果
我有一个包含10个元素的列表(假设C# 如何从FirstOrDefault方法获得性能良好的结果,c#,asp.net,.net,linq,asp.net-core,C#,Asp.net,.net,Linq,Asp.net Core,我有一个包含10个元素的列表(假设list resultList),还有一个包含7039个计数的IQueryable(假设名称为resultQueryable)。我尝试运行以下代码: foreach (var listItem in resultList) { listItem.Amount = resultQueryable.FirstOrDefault(r => r.Id == listItem.Id).Amount; } 但由于resultQueryable存储7039元素和
list resultList
),还有一个包含7039个计数的IQueryable(假设名称为resultQueryable)。我尝试运行以下代码:
foreach (var listItem in resultList)
{
listItem.Amount = resultQueryable.FirstOrDefault(r => r.Id == listItem.Id).Amount;
}
但由于resultQueryable存储7039元素和FirstOrDefault方法返回结果的时间太晚,所以每个代码都要花费大量时间。如何才能获得良好的性能?使用以下代码只提取一次所需的项目,然后处理所提取的项目:
var resultListIds = resultList.Select(li=>li.Id);
var resultSet= resultQueryable.Where(ri => resultListIds.Contains(ri.Id)).ToArray();
foreach (var listItem in resultList)
{
listItem.Amount = resultSet.FirstOrDefault(r => r.Id == listItem.Id).Amount;
}
使用以下代码只获取我们需要的项目一次,然后处理获取的项目:
var resultListIds = resultList.Select(li=>li.Id);
var resultSet= resultQueryable.Where(ri => resultListIds.Contains(ri.Id)).ToArray();
foreach (var listItem in resultList)
{
listItem.Amount = resultSet.FirstOrDefault(r => r.Id == listItem.Id).Amount;
}
发生了两件事:1)您正在以一种非预期的方式重用数据库上下文。有一些选项可以调整性能:创建新上下文和禁用跟踪。2) 您应该能够从1个查询中获取数据-这将显著提高性能。请共享一个。如果您不想这样做,您应该在循环之前
ToDictionary
resultQueryable
。将ID作为键,然后对循环中的字典使用TryGetValue
。您的代码按原样对resultList
中的每个条目执行DB查询。您还可以阅读。发生了两件事:1)您正在以一种非预期的方式重用DB上下文。有一些选项可以调整性能:创建新上下文和禁用跟踪。2) 您应该能够从1个查询中获取数据-这将显著提高性能。请共享一个。如果您不想这样做,您应该在循环之前ToDictionary
resultQueryable
。将ID作为键,然后对循环中的字典使用TryGetValue
。您的代码按原样为resultList
中的每个条目执行DB查询。还可以读取。