Continuam seria articolelor dedicate Linq in .Net Compact Framework cu Linq to DataSet.
Pentru a putea beneficia de facilitatile Linq in C# cand vom aplica Linq asupra DataSet-urilor, este nevoie de referinte catre urmatoarele assembly-uri:
System.Core.dll – defineste nucleul LINQ API. Este obligatoriu pentru a putea folosi LINQ.
System.Data.DataSetExtensions.dll – O extensie care integreaza tipurile ADO.NET cu Linq (Linq to DataSet).
De cele mai multe ori, perspectiva dezvoltatorului in realizarea unei aplicatii care lucreaza cu datele este urmatoarea:
- folosirea ADO.NET pentru obtinerea datelor dintr-o baza de date SQL
- stocarea datelor intr-un set de date (Linq to Dataset) sau in obiecte business realizate de el insusi (Linq to Objects)
- legarea (“bind”) datelor la controale
- validarea datelor
- folosirea serializarii XML pentru mutarea datelor aplicatiei
- actualizarea bazei de date.
Asa cum scriam si in articolul precedent, surpriza neplacuta atunci cand vorbim de Linq in .Net Compact Framework este incapacitatea de a interoga direct o baza de date (nu este suportat Linq to Sql si nici Linq to Entities). Singurul mod de a interoga o baza de date din SQL Server Compact este a incarca mai intai datele intr-un DataSet.
Un Dataset este un “cache in memory” care vine dintr-o sursa de date si este o componenta majora a arhitecturii ADO.NET.
DataSet-ul este organizat asemanator cu o baza de date (tabele cu coloane, inregistrari, relatii intre aceste tabele).
Un Dataset este constituit dintr-o colectie de obiecte de tip DataTable, care pot fi legate printr-un obiect de tip DataRelation.
Cel mai important avantaj pe care il confera DataSet-ul este ca permite lucrul deconectat cu bazele de date. Luam spre exemplificare o aplicatie ale carei date din baza de date nu se modifica foarte frecvent. Aceastea pot fi tinute intr-un DataSet si sincronizate mai tarziu, reducand incarcarea serverului de baze de date.
Bineinteles ca un obiect Dataset trebuie mai intai populat inainte de a fi interogat cu Linq to Dataset. El se construieste prin crearea si umplerea cu date a fiecarui DataTable cu ajutorul unui DataAdapter.
//incarca tabelul STUDENT
sTUDENTTableAdapter.Fill(fMIDataSet.STUDENT);
Folosind Linq, se pot crea “query expressions” in C# (interogari similare cu cele din Sql, dar folosind operatorii speciali de interogare).
Linq to DataSet se poate aplica asupra ambelor tipuri de DataSet-uri, tipizate sau netipizate. In exemplu, voi folosi unul tipizat:
Presupunem ca deja avem creat un obiect de tip DataSet, Student, in aplicatia noastra (vezi download). Vrem sa legam acesta sursa de date la un Combobox, iar ordonarea datelor si filtrarea sa le realizam cu Linq.
Exemplu:
//ordonarea sursei de date dupa varsta
sTUDENTBindingSource.DataSource = fMIDataSet.STUDENT.OrderBy(student=>student.AGE);
//ordonarea sursei de date dupa varsta si dupa nume
sTUDENTBindingSource.DataSource = fMIDataSet.STUDENT.OrderBy(student=>student.AGE).ThenByDescending(student=>student.LASTNAME);
Observatie: Ordonarea nu a fost facuta in interiorul tabelului, ci doar pentru afisare in control. Criteriul de sortare este specificat direct in cod si poate fi modificat la runtime.
//filtrarea sursei de date dupa un criteriu
sTUDENTBindingSource.DataSource = fMIDataSet.STUDENT.Where(student => student.AGE == 23);
Ne putem crea un obiect al unei clase de o anumita structura, dar fara nume –anonim- (nici un obiect al unei alte clase nu va putea fi convertit la un obiect de tip anonim).
//clasa anonima sTUDENTBindingSource.DataSource = fMIDataSet.STUDENT.Select (student=>new { LASTNAME = student.LASTNAME, FIRSTNAME = student.FIRSTNAME } );
Pe langa operatorii standard de interogarii din Linq, Linq to DataSet aduce operatori specifici in cadrul folosirii unui set de obiecte de tip DataRow (operatori de comparare a unor inregistrari, metode care permit accesul la valorile coloanelor dintr-un DataRow).
Linq to Dataset face parte din Linq to ADO.NET, alaturi de Linq to SQL (interogarea directa a bazelor de date SQL SERVER) si Linq to Entities (interogari asupra Entity Data Model).
Linq to DataSet aduce imbunatatiri in munca dezvoltatorului. Verificarea sintaxei si consistenta tipurilor este facuta la compilare de catre Visual Studio.
Linq ofera capacitati de interogare si manipulare a datelor intr-un mod rapid si eficient, eliminand problema diferitelor API-uri in functie de tipul de date.