NHProf genera 'questa istruzione eseguita dal punto di vista' avvertimento quando passo un oggetto ViewModel alla mia pagina ASP.NET MVC View

StackOverflow https://stackoverflow.com/questions/4470425

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?!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top