U nekoliko prethodnih postova pisao sam o novinama i proširenjim nove verzije C# 3.0. Proširenja koja su spomenuta omogućuju implementaciju LINQ (Language Integrated Query) kao nove tehnologije pristupa i manipulacije informacija u aplikaciji.
Uvod
U Posljednjih 20 godina razvoj programskih jezika došao je do stadija kada posjedujemo moćne objektno orijentisane programske jezike poput C++, C#, JAVA, i sl. Programeri danas koriste sve blagodati OOP poput klasa, objekata, nasljeđivanja, polimorfizma i sl. Možemo kazati da je era OOP došla do svog vrhunca kada se počela razvijati tehnologija upravljanja i kontrole curenja memorije u programskim jezicima. U posljednjih nekoliko godina postavlja se pitanje šta dalje i u kom pravcu razvijati programske jezike, na način da pomažu programerima u razvijanju softvera.
Jedan pravac u kojem se ide, a koji je posljednjih nekoliko godina sve više zastupljen je razvijanje IDE alata za automatsko generiranje koda tzv. Rapid Application Developmen (RAD). Danas kad pogledamo software za razvoj aplikacija vidimo mnogo ugrađenih alata za generiranje raznih, uglavnom ponavljajući sekvenci izvornog koda. Danas se aplikacije razvijaju na način da imate osjećaj kako radite u nekom od klasičnih softvera za crtanje: povlačite stavke iz kutija sa alatima, dijagramski pišete klase i dodajete metode, članove, nasljeđivate klase itd.
Sagledavajući današnju tehnologiju i pravac u kome se razvija buduća tehnologija svakako je smanjivanje kompleksnosti pristupa i integracije informacijama koja nije prirodno povezana se OPP. Naime, gotovo svaka aplikacije manipuliše određenim podacima koji su po prirodi stvari odvojeni od same aplikacije. Podaci kojim manipulišemo dolaze uglavnom iz dva glavna izvora, a to su relacijske baze podataka i XML.
Manipulacija sa podacima koji dolaze iz ova dva izvora programera više stvara svestranijim nego stručnijim, jer nužno stvara uslov poznavanja drugih tehnologija osima primarne tehnologije razvoja aplikacija u određenom programskom jeziku. LINQ projekat se bazira na problemima manipulacije podataka opisanih prethodno.
LINQ kako i sam naziv govori je sastavni dio primarnog programskog jezika, koji sa sastoji od standardnih operatora upita za manipulaciju, projekciju, filtriranje sa podacima na način sličan kako se to radi pomoću SQL. Izvor podataka nad kojim se vrše upiti ne ograničava se samo na eksterne izvore podataka, nego na generalno svaki izvor podataka kako eksterni tako i interni – aplikacijski izvor podataka. Ovo omogućuje da programer ostaje u svom primarnom programskom jeziku dok manipuliše podacima iz izvora podataka.
Aplikacija standardnih operatora upita mogu se primjeniti na svaki izvor podataka koji je izveden iz IEnumerable<T> interfejsa.
Ovo omogućava da se razvijaju komponente trećih strana koje podržavaju LINQ, i koje mogu zamjeniti standardne operatore sa svojom vlastitom implementacijom, a samim tim se stvara široka lepeza primjene LINQ.
Upoznavanje sa LINQ
Za početak pogledajmo jednostavan program koji koristi standardne operatore upita primjenjene na polje stringova.
Ako ovaj program pokrenemo kao rezultat ćemo dobiti sve gradove koji se sastoje od 5 slova.
Kao što smo naglasili svaki tip koji je izveden iz IEnumerable<T> interfejsa podržava LINQ operatore. U našem primjeru koristili smo 3 standardna operatora upita: select, where, orderby. Isti primjer možemo napisati bez dotičnih operatora na sljedeći način:
Argumenti koji se pojavljuju u metodama standardnih upita zovem lambda izrazi , oni obezbjeđuju da se standardni operatori upita definišu posebno kao metode i spajaju lančano korištenjem tačka notacije.
Izvršavanje LINQ upita
U prethodnom primjeru značajno je kazati da se evaluacija upita ne dešava u trenutku njegovog deklarisanja. Evaluacija upita se dešava u onom trenutku kada pristupamo varijabli odnosno u našem primjeru evaluacija upita vrši se u bloku koji je označen naredbom foreach. Ovakva odgođena evaluacija upita upit čini fleksibilnim i dozvoljava izvršavanje više puta. Pretpostavimo sljedeći primjer:
Ako pokrenemo aplikaciju rezultat dobivamo:
Upit se evaluira svaki put kada smo iterirali varijablu izraz. Cjelokupan text u 5 dijelova koji je napisan o LINQ možete skinuti odavde.