此部分只是从Excel电子表格中读取。这部分工作正常,没有性能问题。
IEnumerable<ImportViewModel> so=data.Select(row=>new ImportViewModel{
PersonId=(row.Field<string>("person_id")),
ValidationResult = ""
}).ToList();
在我传递给View之前,我想设置ValidationResult,所以我有这段代码。如果我对此进行评论,则模型会快速传递给视图。当我使用foreach时,它将花费一分钟。如果我对item.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());
答案 0 :(得分:5)
您现在正在列表中的每个项目上执行数据库调用。这对您的数据库而言非常困难,因而也是您的表现。尝试通过excel结果进行迭代,收集所有用户并在一个查询中选择它们。根据此查询结果创建一个列表(否则每次访问列表时都会执行查询调用)。然后在结果列表和excel之间执行匹配。
答案 1 :(得分:2)
你需要做这样的事情:
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());