LINQ – .NET Language Integrated Query I Dio


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.

Ultimate Toolbox, Grid i TCP/IP u open source verziji


Jedna od najpoznatijih kompanija koja razvija komponente bazirane na MFC C++ u posljednjih 15 godina bila je zasigurno Dundas Software’s. Njihovi proizvodi imali su prefiks Ultimate (UltimateGrid, UltimateToolbox, UltimateTCP/IP). U januaru 2005 godine David Cunningham and Chris Maunder (osnivač Code Project zajednice) osnivaju firmu TheUltimateToolbox.com, te izdvajaju iz Dundas Software’s Ultimate proizvode. U prethodnih nekoliko dana na Code Project zajednici objavljen je niz članaka u kojima se ove komponente nakon više od 10 godina otvaraju u Open Source verziji. Ove komponente mogu skinuti članovi Code Project zajednice jedne od najvećih zajednica koje razmjenjuju informacije o microsoftovim tehnlogijama C++,MFC, ATL, VB, C#, VB .NET, ASP itd. Više informacije o ovim komponentama možete dobiti ovdje. Naravo morate se učlaniti da bi skinuli cijeli source code.

O CodeProject.com

Ova zajednica broji preko 4,5 miliona članova, u svakom trenutku je preko 15000 članova online. Mogu se pohaviti da sam jedan od prvih članova ove zajednice (657 član od 6. Jula. 2000). Ako se želite baviti programiranjem na nekoj od microsoftovih tehnologija vaš izvor informacija na kojoj možete naći skoro sve što vas zanima je upravo www.codeproject.com.

ADODB Data Link – povezivanje sa bazom podataka


Primjer upotrebe Data Link dijaloga u povezivanju sa bazom podataka. Aplikacija je urađena u C# 2.0 VS2005. Uključen i primjer sa izvornim kodom.

Data Link dijalog je COM objekt pomoću kojeg na jednostavan način definišemo konekciju sa određenim provajderom baze podataka. Nakon podešavanja provajdera potrebno je podesiti server ili putanju do baze podataka (u zavisnosti od provajdera) za validan string konekcije.

U ovom primjeru biti će prezentirana jednostavna demo aplikacija koja poziva Data Link dijalog uzima string za konekciju sa bazom podatka, te pohranjuje isti u user.config datoteku koja obezbjeđuje stalnost stringa za korištenje.

Data Link

Slika 1 Data Link u akciji

DATA LINK Demo

Data Link demo je jednostavna aplikacija koja se sastoji od jedne forme u kojoj preko dugmeta “DataLink” pozivamo Data Link dijalog podešavamo konekciju stringa te isti prikazujemo u edit kontroli. Zatim isti string pohranjujemo u config datoteku.

Na narednoj slici prikazana je demo aplikacija sa kontrolama za manipulaciju da data link dijalogam.

String konekcije

Slika 2 Data Link Demo aplikacija

Prilikom aktivacije klika na dugme DataLink izvršava se sljedeći dio koda za upravljanje sa događajem button1_Click.

void button1_Click(object sender, EventArgs e)
{
    try
    {
        //Izlvacenje tipa šrograma pomocu refleksije
        Type type = Type.GetTypeFromProgID("DataLinks");

        //Formiranje instance dijaloskog okvira Data Link</span>
        object</span> links = Activator.CreateInstance(type);
        //Pojavljivanje dijaloga pomocu kojeg podesavamo konekciju</span>
        object str1 = type.InvokeMember("PromptNew", BindingFlags.InvokeMethod, null, links, null);

        //data link posjeduje osobinu "Connectionstring" u koju pohranjuje konekciju stringa koju smo upravo podesili
        object s = str1.GetType().InvokeMember("ConnectionString", BindingFlags.GetProperty, null, str1, new object[0]);

        //Provjera da li je vracena varijabla ( "ConnectionString" ) validna</span>
        if (s != null)
        {
            //Vracena varijabla je tipa string sto mozemo lako konvertovati</span>
            string strBuid = (string )s;

            //Zapis konekcije string u Edit kontrolu
            textBox1.Text = strBuid;

            //Pohranjivanje stringa konekcije u user config datoteku</span>
            Properties.Settings.Default.Save();

        }
    }

    catch (System.Exception ex)
    {
        MessageBox.Show(ex.Message);
        return;
    }
}

Pohranjivanje konekcija u config datoteku

Kada smo implementriali data link i string konekciju potrebno je isti pohraniti izvan memorije aplikacije da bi se uspješno mogao koristiti prilikom svakog startanja aplikacije. U tom smislu potrebno je definisati varijablu u settings.settings kategoriji a zatim povezati sa textmom edit kontrole. Na narednoj slici prikazan je način definisanja varijable u config datoteci

Pohranjivanje stringa u config datoteku

Slika 3 Definisanje varijable u confg datoteci

Prilikom definisanja varijable potrebno je definisati naziv varijable, tip, te inicijalu vrijednost (Name,Type, Value respektivno). Kolona pod nazivom scope označava na kojem nivou se varijabla definiše. U ovom kontekstu postoje dva nivoa:

  1. User – definisanje varijable na novou korisnika, to znači ako postoji više korisničkih računa u Windows OS, svaki račun će definisati varijablu zasebno. Config datoteka se pohranjuje u [DISK]:\Documents and Settings\[Naziv računa]\Local Settings
  2. Application – definisanje varijable na novou aplikacije i svi windows računi će dijeliti istu vrijednost varijable.

Nakon definisanja varijable potrebno je istu povezati sa textom edit kontrole u glavnoj formi aplikacije. Naredna slika pokazje pridruživanje varijable edit kontroli. Nakon pridruživanja potrebno je implementirati da se string konekcije iz edit kontrole zapiše u config datoteku. Ovo postižemo pozivom :

//Pohranjivanje stringa konekcije u user config datoteku
Properties.Settings.Default.Save();

Definisanje varijable

Slika 4 Povezivanje teksta edit kontrole varijabli stringKonekcije

Kompletan primjer sa izvornim kodom možete skinuti ovdje.