【问题标题】:How can i get result from FirstOrDefault method with good performance如何从 FirstOrDefault 方法中获得性能良好的结果
【发布时间】: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。如果你不想这样做,你应该 ToDictionary resultQueryable before 循环。将 ID 作为键,然后在循环内对字典使用 TryGetValue。您的代码按原样为resultList 中的每个条目执行数据库查询。

标签: c# asp.net .net linq asp.net-core


【解决方案1】:

使用以下代码只获取我们需要的项目一次,然后处理获取的项目:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2021-12-28
    • 2018-04-21
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多