Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从FirstOrDefault方法获得性能良好的结果_C#_Asp.net_.net_Linq_Asp.net Core - Fatal编程技术网

C# 如何从FirstOrDefault方法获得性能良好的结果

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元素和

我有一个包含10个元素的列表(假设
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查询。还可以读取。