環境
windows
ASP.NET MVC5
C#6.0
visualstudio community 2017
ASP.NET MVC5でのアプリケーション制作のトレーニングとして採用システムを作っていますが動作スピードが非常に悪いため改善したいです。
特に遅い箇所が候補者一覧画面で、DBにあるt_entryテーブルから値を持ってきて、それを表示用に加工する為(t_entry以外のモデルの属性を使いたかったりする為)foreachでt_entryのレコードを取り出しview用のモデルviewmodelのインスタンスに一つ一つの属性を追加している状態である為。非常に動作が遅くなっています。
全ての属性や処理を羅列しているとキリがないため、一部を端折りますがどのようなアプローチをとった方が良いかお教え頂くと有難いです。
現状大方のトランザクション処理等全てをコントローラーに書いてあり、MVCの設計に沿っていない形となりますがご容赦ください。
#candidateコントローラークラス/indexアクション public class CandidateController : BaseController { private TestEntities db = new TestEntities(); ・ ・//省略 ・ //候補者テーブルにある削除フラグの立っていない候補者を全て取ってくる var t_entry = _base.t_entry.Where(a => a.DelFlg == 0).OrderByDescending(a => a.EntryId); //1行1行取ってきた候補者に対してforeachで一人一人取り出し、view用のモデルのプロパティに値を入れていく foreach (var list in t_entry) { var phaseId = db.t_selection.Where(x => x.EntryId == list.EntryId).OrderByDescending(x => x.SelectionId).Select(x => x.PhaseId).FirstOrDefault(); string adoptCost = list.AdoptCost != null ? String.Format("{0:#,0}", list.AdoptCost) : ""; CandidateListViewModel candidateData = new CandidateListViewModel { CandidateId = list.EntryId, CandidateName = list.CandidateName, CandidateNameKana = list.CandidateNameKana, JobCategoryName = masterTable.GetJobCategory(list.JobCategoryId), JobCategoryId = list.JobCategoryId, EntryRouteName = masterTable.GetEntryRoute(list.EntryRouteId), CandidateLocationID = list.LocationId, }; candidateList.Add(candidateData); } ・ ・//省略 ・ return View(models); }
//DBファーストで作成したt_entryモデルクラス public partial class t_entry { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public t_entry() { this.t_document = new HashSet<t_document>(); this.t_selection = new HashSet<t_selection>(); } public int EntryId { get; set; } public int SelectionStatusId { get; set; } public int JobCategoryId { get; set; } public int EntryRouteId { get; set; } public Nullable<int> LocationId { get; set; } }
//view用のCandidateListViewモデルクラス public class CandidateListViewModel { public int CandidateId { get; set; } public string CandidateName { get; set; } public string CandidateNameKana { get; set; } public string CandidateLocationName { get; set; } public int? CandidateLocationID { get; set; }
省略為、一部属性があったりなかったり(あとdataがdateって名前になってたり)しますが、、、現状このような形でviewmodelに値を入れていき、この後の処理でviewに対してモデルを渡しております。
長くなりましたが宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー