Durante lo sviluppo di un componente, che utilizza Linq to Sql, nello specifico, un componente che si occupa di gestire gruppi e i relativi utenti , sono incappato in un problema legato alle politiche di caricamento dei dati utilizzate da Linq to Sql, dovuto alla particolare logica, alla base della mia applicazione.
La mia esigenza é quella di caricare i gruppi con i relativi utenti associati, recuperando solo gli quelli non cancellati logicamente, ovvero gestiti sulla relativa tabella tramite un flag "obsoleto" che può assumere valore "S" o "N".
Di default, Linq to Sql carica tutti i gruppi ed i relativi utenti associati sia cancellati logicamente, che attivi.
Per ovviare al problema avrei potuto "spegnere" la proprietà DeferredLoadingEnabled del DataContext, che istruisce opportunamente il framework a adottare politiche di caricamento di tipo lazy loading e che mi avrebbe permesso in seguito, di caricare per ogni singolo gruppo gli utenti non obsoleti. Ma poiché lavoro con pochi dati, quindi non ho problemi di performance ed é molto comodo ottenere tutto quello che mi serve con un'unica chiamata, ho optato per un'altra soluzione.
Per ottenere il risultato desiderato ho utilizzato la classe DataLoadOptions che fornisce le funzionalità per il caricamento e/o il filtraggio immediati dei dati correlati.
La seguente snippet di codice illustra il funzionamento della classe :
public class Gruppo
{
private IEnumerable<BOL.Gruppo> Gruppi = null;
public IEnumerable<BOL.Gruppo> GetGruppi()
{
try
{
GestioneUtentiDataContext Dt = new GestioneUtentiDataContext();
DataLoadOptions dlo = new DataLoadOptions();
// filtro gli utenti del gruppo recuperandone solo quelli non cancellati logicamente
dlo.AssociateWith<BOL.Gruppo>(g => g.Utentes.Where( u => u.obsoleto.Equals('N')));
Dt.LoadOptions = dlo;
Gruppi = from Gruppis in Dt.Gruppos
where Gruppis.Obsoleto.Equals('N')
orderby Gruppis.Descrizione ascending
select Gruppis;
return Gruppi;
}
catch
{
throw;
}
}
}