新手性能问题与foreach..需要建议

本文关键字:foreach 性能 问题 新手 | 更新日期: 2023-09-27 18:31:50

本节只是从Excel电子表格中读取。这部分工作正常,没有性能问题。

IEnumerable<ImportViewModel> so=data.Select(row=>new ImportViewModel{
                  PersonId=(row.Field<string>("person_id")),
                  ValidationResult = ""
                  }).ToList();

在我传递到视图之前,我想设置 ValidationResult,所以我有这段代码。如果我注释掉这个,模型会快速传递到视图。当我使用foreach时,它将花费一分钟多的时间。如果我对项目进行硬编码。PersonId 然后它运行得很快。我知道我做错了什么,只是不知道从哪里开始以及我应该遵循的最佳实践是什么。

foreach (var item in so)
                {
                    if (db.Entity.Any(w => w.ID == item.PersonId))
                    {
                        item.ValidationResult = "Successful";
                    }
                    else
                    {
                        item.ValidationResult = "Error:  ";
                    }
                 } 
return View(so.ToList());

新手性能问题与foreach..需要建议

您现在正在对列表中的每个项目执行数据库调用。这对您的数据库和性能都非常困难。尝试通过您的 excel 结果进行迭代,收集所有用户并在一个查询中选择他们。从此查询结果创建一个列表(否则,每次访问列表时都会执行查询调用)。然后在结果列表和 Excel 之间执行匹配。

你需要

做这样的事情:

var ids = so.Select(i=>i.PersonId).Distinct().ToList();
// Hitting Database just for this time to get all Users Ids
var usersIds = db.Entity.Where(u=>ids.Contains(u.ID)).Select(u=>u.ID).ToList();
foreach (var item in so)
                {
                    if (usersIds.Contains(item.PersonId))
                    {
                        item.ValidationResult = "Successful";
                    }
                    else
                    {
                        item.ValidationResult = "Error:  ";
                    }
                 } 
return View(so.ToList());