C# foreach的新手性能问题…需要建议吗

C# foreach的新手性能问题…需要建议吗,c#,asp.net-mvc,C#,Asp.net Mvc,本节仅从excel电子表格中读取。这部分工作正常,没有性能问题 IEnumerable<ImportViewModel> so=data.Select(row=>new ImportViewModel{ PersonId=(row.Field<string>("person_id")), ValidationResult = "" }).ToList();

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

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

现在,您正在对列表中的每个项目执行数据库调用。这对数据库和性能都是非常困难的。尝试通过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());

我建议在第一行添加
.Distinct
。它可以减少发送到SQL Server的数据量
varids=so.select(i=>i.PersonId.Distinct().ToList()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());