Generale
Quando si esegue una query per un oggetto, in realtà si recupera solo l'oggetto richiesto. Gli oggetti correlati non vengono automaticamente recuperati allo stesso tempo. (Per ulteriori informazioni, vedere Esecuzione di una query tra relazioni (LINQ to SQL).)
La classe DataLoadOptions fornisce due metodi per ottenere il caricamento immediato dei dati correlati specificati. Il metodo LoadWith consente il caricamento immediato dei dati correlati alla destinazione principale. Il metodo AssociateWith consente il filtraggio degli oggetti correlati.
Regole
Di seguito vengono riportate le regole che riguardano l'utilizzo di DataLoadOptions:
L'assegnazione di un oggetto DataLoadOptions a un oggetto DataContext dopo l'esecuzione della prima query genera un'eccezione.
La modifica di un oggetto DataLoadOptions dopo che è stato assegnato a un oggetto DataContext genera un'eccezione.
Gestione dei cicli
Le direttive LoadWith e AssociateWith non devono creare cicli. Di seguito sono riportati alcuni esempi di tali grafici:
Esempio 1: autoricorsivo
Esempio 2: puntatori all'indietro
Esempio 3: cicli più lunghi
Anche se non dovrebbero verificarsi in un modello ben normalizzato, è possibile che si verifichino.
dlo.LoadWith <A>(a => a.Bs);
dlo.LoadWith <B>(b => b.Cs);
dlo.LoadWith <C>(c => c.As);
Esempio 4: sottoquery autoricorsive
Esempio 5: sottoquery autoricorsive più lunghe
Di seguito sono elencate alcune regole generali che consentono di capire ciò che accade in questi scenari.
LoadWith Ogni chiamata a LoadWith controlla se i cicli sono stati introdotti nel grafico. In caso affermativo, come negli Esempi 1, 2 e 3, viene generata un'eccezione.
AssociateWith In fase di esecuzione il motore non applica le clausole SubQuery esistenti alla relazione all'interno dell'espressione.
Nell'esempio 4 la clausola Where viene eseguita a fronte di tutti gli oggetti A, non solo quelli sottofiltrati dall'espressione SubQuery stessa (perché sarebbe ricorsiva)
Nell'esempio 5 la prima clausola Where viene applicata a tutti gli oggetti B, anche se esistono sottoquery su B. La seconda clausola Where viene applicata a tutti gli oggetti A, anche se esistono sottoquery su A.