Come recuperare oggetti più livelli profondi e larghi con nhibernate?
-
28-10-2019 - |
Domanda
Ho un caso in cui ho bisogno di caricare circa 10.000 oggetti dal database. Il modello di dati è qualcosa di simile:
public class SimulationObject
{
public Container Container {get;set;}
public IList<ResultItem> Results {get;set;}
public IList<PreviewData> PreviewData {get;set;}
...
}
public class ResultItem
{
public IList<SomeDataItem> Items {get;set;}
...
}
public class PreviewData
{
public IList<SomeDataItem> Items {get;set;}
...
}
Ciò significa che voglio interrogare un elenco di objects di simulazione dal database in base a alcune domande e tutte le sue proprietà (riferimenti) e i subite.
Le quantità di collezioni sono le seguenti:
- SimulationObject - CA 6000 - 1200, a seconda dei parametri in "Where"
- SimulationObject.Results - CA da 5 a 40 articoli
- SimulationObject.Results.Items - CA 0 a 2 articoli
- SimulationObject.previewData - CA 0 a 2 articoli
- SimulationObject.previewData.Items - CA 1 a 3 elementi
Normalmente, lo farei in questo modo:
var query = from sim in session.Query<SimulationObject>()
where sim.Container.Id == containerId && ...
select sim;
query = query.FetchMany(c => c.Results).ThenFetch(o => o.Items)...
Tuttavia, ho anche bisogno di recuperare gli articoli "anteprimadata" per quello che creerebbero un prodotto cartesiano nella mia query (il che significa anteprimadataandsubitemcount x risultati e la quantità di righe restituiti) che è molto inefficace. Inoltre, poiché ho bisogno di caricare molti objects di Sumulation (circa 10000 come Sayd in precedenza), non posso fare un carico pigro (10000 domande ... e ci sono anche altre difficoltà, quindi questa non è nemmeno un'alternativa da considerare).
Quindi quali sono le alternative ? Quale strategia useresti per caricare un grafico a oggetti complicati in memoria?
Grazie.
Soluzione
Ayende spiega un modo per farlo qui (HQL):
http://ayende.com/blog/4367/eagerly-loading-enty-associations-efficiente-with-with-nhibernate
C'era anche un articolo di StackOverflow che mi sono imbattuto che lo fa usando Queryover:
NHIBERNATE Agguato caricamento con API queryover su un grafico a oggetti complessi
Sarei molto interessato a ottenere ulteriori input dal resto della comunità HTE. Penso che questa sia un'area in cui NH potrebbe migliorare.