1

ViewModel を View ページに渡すサイトの 1 つのページで、NHProf が次の警告を出していることに気付きました。

このステートメントはビューから実行されたため、パフォーマンスが低下したり、動作が不安定になる可能性があります。

次に、このページにリンクします: http://nhprof.com/Learn/Alerts/QueriesFromViews

私の ViewModel は 2 つのプロパティだけで構成されています。

public IEnumerable<Photo> Photos { get; set; }
public Photo SelectedPhoto { get; set; }

次のように、コントローラ内でこの ViewModel に写真を割り当てます。

PhotoViewModel myViewModel = new PhotoViewModel();
myViewModel.Photos = entity.Photos;

My View は明らかにこのタイプを継承し、(オブジェクトを利用する) ヘッダーを出力することを除けば、それぞれのコンテンツをレンダリングSelectedPhotoするそれぞれをループするだけです。Photos

NHProf は、ビュー内でループしている写真のコレクションを取得する場所として「問題」クエリを示していますが、オフにしてビュー内からそれらのレコードを取得するように明示的に指示していません-合格しましたPhotos私のViewModelのプロパティ内のそれらのレコード。

ViewModel を渡す必要のない他のページがあり、単純IEnumerable<Photo>に View に渡し、問題のビューで行ったのとまったく同じようにマークアップをレンダリングします。NHProf は警告を表示しません (あるべきではないため)。 ) そのシナリオで。

おそらく遅延読み込みに関連していると思います。私のコレクションはViewModelの一部であるためPhotos、ViewModelタイプ内のプロパティをループすると、その時点でそれらのレコードが取得されますか?

ここで何が起こっているのか誰にも分かりませんか?このサイトは完璧に機能していますが、NHProf は、本来すべきではないところから何かを行っていることに気付きます?!

4

2 に答える 2

4

Photosコレクションがどのように生成されるかを示していませんが、 viewModel.Photos = entity.Photos. それが正しい場合 (または同様の場合)、遅延読み込みされたエンティティ コレクションをビュー モデルに割り当てているだけです。

これに取り組む方法はいくつかありますが、基本的にはすべて同じです。ビュー モデルにデータを入力する前に、コレクションの読み込みをトリガーする必要があります。これを行う最も簡単な方法は、.ToArray()割り当てているコレクションに a または同等のものを貼り付けることです。それはフェッチを強制します。

于 2010-12-17T13:06:11.840 に答える
1

あなたが正しいです。遅延読み込みに関連しています。熱心に写真を読み込んでみてください。そして、それらの関係を確認してください。熱心な読み込みが必要な場合や、必要がない場合、またはビューで関連付けられたエンティティを使用しようとしている場合があります。

于 2010-12-17T12:37:29.197 に答える