You are on page 1of 12

www.mscommunity.

ba
Bahrudin Hrnjica

LINQ
LINQ ili Language Integrated Query je sastavni dio .NET programskog (.NET 3.5 ) jezika prilagodjen da
izvršava upit nad bilo kojom vrstom izvora podataka na način kako se to radi sa SLQ jezikom. LINQ čini
skup operatora koji po mnogo čemu sliče SQL komandama. Pomodu LINQ operatora mnogostuko se
skraduje vrijeme sortiranja, grupiranja, filtriranja podataka koji se dosada morao implementirati ili
koristiti biblioteke tredih lica. LINQ koristimokako za memorijske rako i za ekstenre izvore podataka
poput DB i XML.
LINQ Language Integrated Query

LINQ - Language Integrated Query

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
osim primarne tehnologije razvoja aplikacija u određenom programskom jeziku.
LINQ projekat se bazira na problemima manipulacije podataka prethodno opisanih.
Engleski izgovor ove kratice izgovara se kratko LINK.

LINQ kako i sam naziv govori je sastavni dio primarnog programskog jezika, koji sa
sastoji od standardnih operatora upita za manipulaciju, projekciju i 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.

2| S t r a n i c a
LINQ Language Integrated Query
Aplikacija standardnih operatora upita mogu se primjeniti na svaki izvor podataka
koji je izveden iz IEnumerable<T> interfejsa. Ovo omogućava razvijanje
komponenti trećih strana baziranih na LINQ preklapanjem standardnih operatora.
Do sada takvih implementacija je uradjeno a najpoznatiji su LINQ to Amazon, LINQ
to Goole i td. Važno je spomenuti da se na Open Source zadnicama poput Source
Forge pokrenute više desitina sličnih projekata.

Upoznavanje sa LINQ

Kao i svaki početak i ovaj ćemo krenuti jednostavnim primjerom koji koristi
standardne operatore upita primjenjene 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:
3| S t r a n i c a
LINQ Language Integrated Query

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:

4| S t r a n i c a
LINQ Language Integrated Query
Ako pokrenemo aplikaciju rezultat dobijamo:

Upit se evaluira svaki put kada smo iterirali varijablu izraz.

Međutim odgodjeno izvršavanje LINQ upita može dovesti u zabludu, posebno ako
se nepoznaje dovoljno način na koji se izvršava LINQ upit.

Pretpostavimo sljedeći primjer:

U primjeru imamo definisan LINQ upit sa varijablom prvoSlovo, i gdje smo
formirali LINQ upit kada je dotična varijabla imala vrijednost „S“. U normalnim
uslovima onako kako smo naučili da se varijable inicijaliziraju i po logici stvari LINQ
upit bi trebao vratiti sve gradove koji počinju sa prvim slovom S. Medjutim rezultat
upita prikazan je na sljedećoj slici:

5| S t r a n i c a
LINQ Language Integrated Query

To upravo pokazuje način i vrijeme kada se LINQ upit generiše i evaluira nad
izvorom podataka.

LINQ Standardni operatori upita

U prethodnom izlaganju vidjeli smo upotrebu nekoliko operatora upita. U ovom
poglavlju pozabavit ćemo se više oko ovih operatora, te vidjeti na koji ih način
koristiti efikasno u programima. Razvijajući aplikacije, programer konstantno
rješava određene probleme manipulacije sa podacima. U tu srhu koriste se
određene preinstalirane biblioteke kao i biblioteke od trećih lica. Nažalost nismo
uvijek u prilici da sa bibliotekama koje koristimo imamo riješene sve probleme.

LINQ Operatori upita mnoge naše probleme kojim smo svakodnevno okruženi
tokom razvoja aplikacija, mogu zaista efektivno riješiti u samo nekoliko linija koda.
Kao što smo kazali LINQ ne predstavlja manipulaciju samo sa eksternim izvorima
podataka. Također ove osobine jezika koristimo i sa memorijskim izvorom. U
narednom tekstu upoznat ćemo se sa operatorima upita te kroz primjere primjene
pokazati njihovu jednostavnost, efikasnost i lakoću.

Operatori sortiranja (orderby, reverse, descending)

Već smo u prvom dijelu vidjeli upotrebu sortiranja podataka. Prednosti korištenja
ovog operatora nad kolekcijama koje nejmaju implementiranu ovu mogućnost su
vrlo korisne.

Uzmimo iz prethodnog primjera polje stringova i primjenimo operator sortiranja.
Npr sortirajmo uzlaznim i slizanim redom gradove u BiH:

Međutim, sortiranje možemo izvršiti po nekom drugom kriteriju npr. po broju slova
u nazivu:

6| S t r a n i c a
LINQ Language Integrated Query

Kriterije možemo lančano slagati i tačka notacijom. U tom slučaju koristimo ThenBy
operator poslije OrderBy operatora. Kombinirajmo prethodna dva primjera i
napišimo sljedeći primjer:

Reverse operator koristimo kada želimo sortirani niz obrnuti. Sljedeći primjer
prikazuje upotrebu operatora Reverse i OrderbyDescending, da bi prikazali
suštinsku razliku između ova dva operatora.

Rezultat prethodnih upita prikazan je na sljedećoj slici:

Reverse operator za razliku od OrderBy operatora oslanja se samo na poredak
podataka koji je dobijenih iz izvora podataka.

GroupBy operator

Skup standardni operatora upita čini i operator grupiranja GroupBy, koji uspostavlja
podjelu nad sekvencijalnim vrijednostima temeljenih na funkcijama ekstrakcije.

7| S t r a n i c a
LINQ Language Integrated Query
Ovaj operator vraća skup IGrouping podataka za svaki različiti vrijednosni kriterij.
Svakako da je IGrouping izvedeni interfejs od IEnumerable koji dodatno sadrži
kriterij koji je korišten za ekstrakciju podataka iz izvora.

Jednostavan primjer upotrebe GroupBy operatora možemo predstaviti na sljedećem
primjeru:

Poslije pokretanja ovog programa rezultat je prikazan na sljedećoj slici:

8| S t r a n i c a
LINQ Language Integrated Query

Agregacijski operatori

Agregacijski operatori koji su podržani u LINQ definišemo na sličan način. Napišimo
primjer upotrebe agregacijskog operatora Agregate. Ovaj operator vrši određenu
kalkulaciju na sekvencom podataka. Operator vrši operacije koristeći lambda izraze
nad svakoj sekvenci podataka. Sljedeći primjer izračunava broj karaktera korištenih
u cijelom nizu:

Rezultat pokretanja programa:

Agregate operator propisuje Count operator i 4 numerička agregacijska
operatora(Min, Max, Sum, i Average) minimum, maksimum, suma i srednja
vrijednost respektivno. Ovi se numerički operatori procesuiraju nad sekvencama
podataka bilo kojeg numeričkog tipa podataka: int, double, decimal i sl.

Sljedeći primjer prokazuje upotrebu nekoliko pomenutih operatora:

9| S t r a n i c a
LINQ Language Integrated Query

Rezultat pokretanja programa prikazan je na sljedečoj slic:

Sintaksa upita u LINQ

U prethodnim postovima vidjeli smo načine kako možemo formirati upit nad
izvorom podataka. Takodjer se može primjetiti da svaki upit možemo formirati na
dva, u suštini ista, a sintaktički različita načina. Naime svaki LINQ upit formiran
Lambda izrazom, takodjer možemo formirati tačka notacijom (Dot Notaton).
Ovakav fleksibilam pristup definisanju upita u LINQ rezultat su proširenja koja se
pojavljuju u novoj verziji C#, a koje smo spominjali u prethodnim postovima.

Npr. definišimo LINQ upit tačka notacijom. Imamo:

10| S t r a n i c a
LINQ Language Integrated Query
var izraz= nazivi
.Where(s=>s.Lenght==6)
.OrderBy(s=>s)
.Select(s=>s.ToUpper());

Prethodni upit možemo formirati Lambda izrazom na sljedeći način:

var izraz= from s in imena
where s.Lenght ==6
orderby s
select s.ToUpper();

Na kraju ovog članaka pobrojat ćemo sve operatore koji se mogu pojaviti u LINQ
upitima:

OPERATOR Opis
Where Restriktivni operator.
Select / SelectMany Operator projekcije.
Take/Skip Parcijalni operator baziran na poziciji ili uslovnoj
funkciji.
TakeWhile/SkipWhile
Join/GroupJoin Operator spajanja u odnosu na zadani uslov.
Concat Operator spajanja.
OrderBy/ThenBy/ Sortiranje u uzlaznom, silaznom smijeru u odnosu
na zadani uslov.
OrderByDescending
ThenByDescending
Reverse Operator sortiranja sekvence u suprotnom smijeru
GroupBy Operator grupiranja u odnosu na zadani uslov.
Distinct Operator uklanjanja duplikata elemenata u skupu.
Union/Intersect Operatr koji vraća uniju ili podskup zadanih skupova
elemenata.
Except Operator koji vraća komplement zadanog skupa.
ToSequence Operator konverzije u IEnumerable<T>
ToArray/ToList Operator konverzije u List<T>
ToDictionary/ToLookup Operator konverzije u Dictionary<K,T> ili
LookUp<K,T> u odnosu na zadani ključ.
OfType/Cast Operator konverzije u Ienumerable<T>u odnosu na
filtrirane elemente ili konverzije u tip argumenta.
EqualAll Operator jednakosti koji vraća jedenake uparene
elemente.
First/FirstOrDefault/ Operator vraćanja početne/zadnje/jednog elementa
u odnosu na zadanu funkciju.
Last/LastOrDefault/
Single/SingleOrDefault
ElementAt/ Operator vraćanja elementa određene pozicije.

11| S t r a n i c a
LINQ Language Integrated Query

ElementAtOrDefault
DefaultIfEmpty Operator zamjene prazne vrijednosti sa
podrazumijevanom.
Range Generatorski operator vraćanja broja u opsegu.
Repeat Generatorski operator vraćanja višestrukih
pojavljivanja elementa zadane vrijednosti.
Empty Generatorski operator vraćanja prazne sekvence.
Any/All Kvantifikator provjere egzistencije ili univerzalnosti
funkcije izraza.
Contains Kvantifikator provjere postojanja datog elementa.
Count/LongCount Agregacijski operatori brojanja elemenata.
Sum/Max/Min/Average Agregacijski oparatori kao opcione funkcije
selektora.
Aggregate Agregacijski oparator , vidi dio III

REFERENCE

1. The LINQ Project .NET Language Integrated Query May 2006 Don Box, Architect, Microsoft Corporation
and Anders Hejlsberg, Technical Fellow, Microsoft Corporation

2. http://forums.microsoft.com/msdn/showforum.aspx?forumid=123&siteid=1

3. http://weblogs.asp.net/scottgu/

4. http://microsoft.com

12| S t r a n i c a