Nei precedenti post (1
2
3
4) ho parlato un po' di repository e naturalmente il cuore di un repository è la metodologia utilizzata per fare le query. Nei precedenti post ho mostrato una tecnica poco intrusiva per specificare i criteri di una query senza dovere costruire un Query Model vero e proprio, ma tramite delegate anonimi. Per chi ha già visto un po' di .NET 3.5 la domanda che ci si pone è "ha senso parlare di querymodel quando il futuro ci riserva LINQ?".
Premesso che non sono assolutamente un esperto di LINQ, sicuramente la domanda ha una risposta sola, probabilmente non avrà più senso di parlare di query model quando il linguaggio fornisce già nativamente una sintassi (LINQ appunto) completamente integrata e con supporto del compilatore. Di LINQ esistono molte versioni, in pratica LINQ è un linguaggio integrato di query che permette di fare query su diversi oggetti. Nativamente LINQ permette di fare query direttamente su collezioni di oggetti tipo List<T>, ma esistono altre implementazioni come il LINQ to SQL che è un ORM vero e proprio, qui potete trovare alcune informazioni. Ma vediamo ora se è possibile dotare il nostro codice di supporto a LINQ con poco sforzo.
Nei post precedenti abbiamo implementato la nostra interfaccia IRepository<T> tramite NHibernate e come si può verificare da questo link, c'è qualcuno nella community che si è dedicato a scrivere il codice per fare LINQ to NHibernate, in pratica una serie di classi che permettono di effettuare query LINQ su una sessione NHIbernate. Nel caso della nostra interfaccia IRepository<T> si potrebbe scrivere un provider del tipo LINQ to repository, ma in generale questa cosa appare assai superflua, una possibilità potrebbe essere la seguente, aggiungere una funzione che permetta di effettuare query LINQ su di un repository.
In pratica la funzione aggiunta restituisce un interfaccia IOrderedQueryable che permette di effettuare query LINQ. Questa soluzione è comoda perché il progetto LINQ to NHIbernate supporta proprio questa modalità. Il nostro repository concreto non deve fare altro che implementare questa funzione.
Come si può vedere il codice è veramente banale perché tutto il vero lavoro viene fatto dalla libreria LINQ to NHibernate. Con questo semplice codice possiamo fare query LINQ sul nostro repository.
Chiaramente questo è solo un primo esempio di come LINQ potrebbe interagire con un nostro IRepository<T>, ma con pochissime righe di codice è già possibile avere un piccolo esempio funzionante grazie a LINQ to Nhibernate.
Alk.