Molto spesso ci si limita ad utilizzare LINQ nelle sole varianti LINQ to Objects, LINQ to XML, LINQ to SQL e LINQ to Entities quando si scrivono query per Entity Framework. Questo accade perchè questi provider LINQ sono presenti direttamente nel .NET Framework.
LINQ è nato per essere estendibile da chiunque. La sua architettura permette di creare provider che eseguono interrogazioni verso le più disparate fonti dati. Un primo esempio l'abbiamo dato tempo fa in questo articolo.
Sul web sono stati pubblicati diversi provider che permettono di accedere ad Active Directory, liste in Javascript, Excel oppure addirittura a servizi esterni come Bing, Facebook e Twitter. In questo articolo vedremo alcuni di questi provider, mostrando come possano essere molto utili per semplificare il codice delle nostre applicazioni.
LINQ to Excel
Il primo provider che andiamo ad analizzare permette di effettuare query LINQ su file Excel. Chiunque abbia lavorato con Excel sa bene che utilizzare OleDb o altri provider dedicati è sì comodo, ma mai tanto quanto utilizzare LINQ. La tipizzazione delle query e l'astrazione dal provider che accede al file sono due vantaggi innegabili che nessun altra tecnica offre. Il provider è liberamente scaricabile a questo indirizzo.
Per questa demo, il file che andiamo ad utilizzare ha tre colonne: Nome, Cognome ed Età.
Per descrivere i dati, creiamo una classe Person con le tre proprietà. Questa classe deve essere decorata con l'attributo ExcelSheet, mentre le sue proprietà vanno decorate con l'attributo ExcelColumn. Inoltre, poichè il provider permette anche l'aggiornamento dei file, bisogna implementare l'interfaccia INotifyPropertyChanged.
ExcelSheet accetta un parametro che rappresenta il nome del foglio all'interno del file excel. Se il parametro non viene passato, il nome del foglio deve corrispondere con il nome della classe.
ExcelColumn accetta un parametro (Name) che specifica il nome della colonna mappata sulla proprietà ed un altro parametro (Storage) che specifica il campo dietro alla proprietà. Nel file excel il nome della colonna deve essere inserito nella prima riga. Così come per ExcelColumn, anche qui se il nome non viene passato, il nome della proprietà viene utilizzato per mappare sulla colonna.
Nel setter della proprietà si deve invocare il metodo SendPropertyChanged specificando la proprietà modificata per notificare l'avvenuto cambiamento al provider.
[ExcelSheet(Name = "Sheet1")] public class Person : System.ComponentModel.INotifyPropertyChanged { private string _firstName; private string _lastName; private int _age; public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; protected virtual void SendPropertyChanged(string propertyName) { System.ComponentModel.PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); } [ExcelColumn(Name = "FirstName", Storage = "_firstName")] public string FirstName { get { return this._firstName; } set { _firstName = value; SendPropertyChanged("FirstName"); } } [ExcelColumn(Name = "LastName", Storage = "_lastName")] public string LastName { get { return this._lastName; } set { _lastName = value; SendPropertyChanged("LastName"); } } [ExcelColumn(Name = "Age", Storage="_age")] public int Age { get { return this._age; } set { _age = value; SendPropertyChanged("Age"); } } }
Ora che il codice di base è pronto, possiamo passare all'utilizzo vero e proprio del provider. La classe da cui tutto comincia è ExcelProvider. Questa classe può essere vista un pò come l'ObjectContext di EntityFramework.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.