NHProf genera 'questa istruzione eseguita dal punto di vista' avvertimento quando passo un oggetto ViewModel alla mia pagina ASP.NET MVC View
-
11-10-2019 - |
Domanda
Ho appena notato che su una pagina del mio sito, dove passo davanti a un ViewModel alla mia pagina Vedi, NHProf sta dando il seguente avviso:
Questa istruzione eseguita dalla vista, che può risultare in cattive prestazioni e / o comportamento fragile.
Si collega poi a questa pagina: http://nhprof.com/Learn/Alerts/QueriesFromViews
Il mio ViewModel si compone di soli 2 oggetti:
public IEnumerable<Photo> Photos { get; set; }
public Photo SelectedPhoto { get; set; }
I assegnare le foto a questo ViewModel nel mio controller come segue:
PhotoViewModel myViewModel = new PhotoViewModel();
myViewModel.Photos = entity.Photos;
My View eredita ovviamente questo tipo, ea parte l'output di un colpo di testa (che fa uso dell'oggetto SelectedPhoto
), semplicemente scorre ciascuno dei Photos
rendering di alcuni contenuti per ciascuno di essi.
spettacoli NHProf il 'problema' di query ad essere dove si recupera la raccolta di foto che sto scorrendo a mio avviso, anche se io non sono esplicitamente dicendogli di andare fuori e ottenere i record da dentro il mio vista - I 've superato i record all'interno della proprietà Photos
del mio ViewModel.
Non ho altre pagine in cui non ho bisogno di passare un ViewModel e ho semplicemente passare IEnumerable<Photo>
alla vista, e quindi rendere il markup esattamente come faccio io nella vista problema, e NHProf dà nessun avviso (come ci non dovrebbe essere) in questo scenario.
Sto pensando che forse è legato al caricamento pigro, e poiché la mia collezione è parte di un ViewModel, quando vado a ciclo attraverso la proprietà Photos
all'interno del tipo ViewModel, si va a prendere i record a quel punto?
Qualcuno ha idea di cosa sta succedendo qui? Le funzioni del sito perfettamente, ma NHProf appena vede che sta facendo qualcosa da cui non si dovrebbe farlo?!
Soluzione
Non hai dimostrato come la vostra collezione Photos
viene popolata, ma suppongo che sia così semplice come viewModel.Photos = entity.Photos
. Se questo è corretto (o qualcosa di simile), allora si sta solo assegnando la collezione entità lazy-caricato per il vostro modello di visualizzazione.
Ci sono diversi modi per affrontare questo, ma sono tutti essenzialmente la stessa: è necessario per attivare il caricamento della vostra collezione prima di popolare il modello di vista. Il modo più semplice per farlo è quello di attaccare solo un .ToArray()
o equivalente sulla raccolta si sta assegnando; che sarà forzare un recupero.
Altri suggerimenti
Hai ragione. Esso è legato al caricamento pigro. Provate a caricare foto con entusiasmo. E controllare le loro relazioni. Forse hanno alcuni con eager loading, non occorre, o se si stanno cercando di utilizzare entità associata nella vista.