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:

  1. SimulationObject - CA 6000 - 1200, a seconda dei parametri in "Where"
  2. SimulationObject.Results - CA da 5 a 40 articoli
  3. SimulationObject.Results.Items - CA 0 a 2 articoli
  4. SimulationObject.previewData - CA 0 a 2 articoli
  5. 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.

È stato utile?

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.

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