3

このセクションは、Excelスプレッドシートから読み取るだけです。この部分は、パフォーマンスの問題なしで正常に機能します。

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

ビューに渡す前に、ValidationResultを設定して、このコードを作成します。これをコメントアウトすると、モデルはすぐにビューに渡されます。foreachを使用すると、1分以上かかります。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());
4

2 に答える 2

5

これで、リスト内のアイテムごとにデータベース呼び出しを実行しています。これはあなたのデータベース、ひいてはあなたのパフォーマンスにとって本当に難しいことです。Excelの結果を確認し、すべてのユーザーを収集して、1つのクエリでそれらを選択してみてください。このクエリ結果からリストを作成します(そうでない場合は、リストにアクセスするたびにクエリ呼び出しが実行されます)。次に、結果リストとExcelを照合します。

于 2012-04-22T08:29:58.377 に答える
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());
于 2012-04-22T11:32:03.493 に答える