Linq helpottaa sql-kyselyjä

Jani Järvinen

Linq helpottaa sql-kyselyjä

Tietokantoja ohjataan sql-kielisin komennoin, jolloin kehittäjien on usein kirjoitettava sekaisin ohjelmakoodia ja sql-lauseita. Miksei tietokannoista voisi hakea tietoja ohjelmointikielten syntaksilla?

Eräs ohjelmoinnin perusperiaatteista on, ettei eri ohjelmointikieliä tulisi sekoittaa keskenään samoihin lähdekooditiedostoihin. Käytännössä ihanteesta on jouduttu tinkimään silloin, kun on haluttu hakea tietoja sql-tietokannoista. Tällöin vaikkapa C++-kielisen lähdekoodin joukkoon on jouduttu kirjoittamaan sql-lauseita. Tämä tekee koodista vaikeasti ymmärrettävää ja hankaloittaa ohjelman ylläpitoa.

Microsoftin tuoreimmassa Visual Studio 2008 -versiossa on kuitenkin käytettävissä uusi tekniikka nimeltä Language Integrated Query (lyhyesti linq), joka yhdistää ohjelmointi- ja kyselykielet.

Linqin ajatuksena on tarjota C#- ja Visual Basic .Net -ohjelmointikieliä käyttäville ohjelmoijille mahdollisuus hakea tietoja tietokannoista ohjelmointikielten omilla tätä varten lisätyillä komennoilla.

Linq esiteltiin Visual Studio 2008:n ja .Net-kirjastoversion 3.5 myötä. Sitä käyttävät sovellukset tarvitsevat siis tuekseen uusimmat .Net-kirjastot. Koska kyse on myös sekä uudesta syntaksista että uusista avainsanoista (keywords) ohjelmointikieliin, täytyy esimerkiksi C#-kääntäjän olla lisäksi uusinta 3.0-versiota.

Hiukan harmillisesti linq on parhaimmillaan Microsoftin oman SQL Serverin kanssa. Luultavaa kuitenkin on, että jatkossa tietokantatuki paranee. Pelkkien sql-tietokantojen lisäksi linq tukee hakuja olioista sekä xml-tiedostoista.
Tietolähteestä riippumatta kyselysyntaksi on lähes identtinen, joten kehittäjien ei tarvitse erikseen miettiä, mistä tieto on milloinkin tulossa. Tämä nopeuttaa työskentelyä.

Syntaksi tutuksi

Linqin syntaksi muistuttaa monelta osin sql-kieltä, siitä löytyvät esimerkiksi SELECT-lauseista tutut avainsanat from, where ja orderby. Avainsanojen järjestyksessä ja kirjoitusasussa on hienoisia eroja, mutta kelle tahansa sql:n tuntevalle linqin syntaksi on tutunoloista.

Yksinkertaisimmillaan linq-kyselyiden avulla voidaan hakea tietoja yhdestä oliosta, eli relaatiotietokantojen termein yhdestä taulusta. Linqin tuki muillekin tietolähteille mahdollistaa tietojen haun myös taulukoista ja kokoelmista (collections).

Esimerkiksi kokonaislukutaulukosta voidaan hakea alkioita ja järjestellä tulokset listauksen 1 mukaisella kyselyllä. Linqin avulla kehittäjä voi hyödyntää sql-kielestä oppimaansa ORDER BY -lausetta sellaisenaan ja lajitella tulokset helposti.

Useimmiten tietoja halutaan kuitenkin hakea sql-tietokannoista. Listauksen 2 mukaista kyselyä tarkasteltaessa havaitaan mielenkiintoisia ominaisuuksia.

Where-hakuehtona voidaan käyttää esimerkiksi .Net-luokkakirjastoon kuuluvan String-luokan toimintoja. Koska SQL Server ei tue String-luokan StartsWith-metodia, linq muuntaa ohjelmoijan kirjoittamat C#-kieliset lauseet sellaisiksi, että SQL Server ymmärtää ne. Tuloksena syntyvää sql-lausetta voi tarkastella esimerkiksi Visual Studion virheenjäljitystilan kautta.

Kyselyllä voidaan myös hakea tuloksia useasta taulusta liitosten (join) avulla. Esimerkissä käytetään liitosta join-lauseen avulla yhdistämään asiakastiedot asiakkaan tilauksiin.

Projektioita ja koosteita

Tyypillisissä tietokantakyselyissä tuloskenttiä halutaan rajata niin, että vain tarpeelliset kentät palautetaan. Asiakas-taulussa saattaa esimerkiksi olla kymmeniä kenttiä yhteystietojen tallentamiseen, mutta tietojen selaamiseen saattaa riittää pelkkä asiakasnimi.

Linq-kielessä kyselyiden tulokset tallennetaan olioihin. Tallennettavat tiedot voidaan valita projektioiden (projection) avulla. Tyypillisimmillään projektioita käytetään syötettäessä halutun tuloskentän nimet select-avainsanan jälkeen.
Projektioiden avulla kyselyn tuloksista voidaan koostaa kokonaan uudenlaisia olioita. Jos vaikka tuotteen myyntihinta halutaan laskea sekä verollisena että verottomana, voidaan C#-kielen new-operaattorin avulla luoda kyselyn tuloksista uusi olio, josta löytyvät tarvittavat tiedot (listaus 3).

Laskennassa on mahdollista käyttää myös sql-kielestä tuttuja koostefunktioita (aggregate func­tions). Näitä käytettäessä koko linq-kysely voidaan kirjoittaa sulkeiden sisään, ja loppusulkeen jälkeen lisätään pisteellä erotettu metodin nimi.

Xml-tuki

Nykyisissä sovelluksissa tarvitaan usein xml-muotoisen tiedon käsittelyä. Esimerkiksi liitynnät toisiin järjestelmiin tai internetpohjaisiin palveluihin saattavat vaatia xml:n käyttöä. Perinteisesti xml:ää on käsitelty dom-oliomallin mukaisesti, mutta malli eroaa huomattavasti esimerkiksi relaatiotietokantojen käsittelystä.

Linq pyrkii tuomaan xml:n käsittelyn lähemmäksi relaatiotietokannoista tuttua käsittelytapaa. Xml-elementit voidaan määrittää linqin avulla hierarkkisesti, jolloin tarvittava C#-syntaksi on perinteistä dom-syntaksia selkeämpi. Toisaalta tiedot voidaan hakea xml-muotoisesta tiedosta sql-syntaksia noudattelevalla lauseella.

Xml-tietojen haussa käytettävä linq-kysely ei ole täysin yhtenevä sql-tietokantojen kanssa käytettävän syntaksin kanssa, mutta selvä lähisukulaisuus on havaittavissa. Listaus 4 näyttää esimerkin xml-tietojen hausta.

Taustalla luokkakirjastot

Linq-kyselyt saattavat ensisilmäyksellä näyttää kummallisilta lisäyksiltä C#- ja Visual Basic .Net -kieliin, sillä niiden syntaksi on täysin uudenlaista ja aiemmista rakenteista poikkeavaa. Käytännössä linq on toteutettu laajan luokkakirjaston turvin, joka on osa .Net 3.5 -luokkakirjastoa.

Kun C#-kääntäjä havaitsee linq-kyselyn, kääntäjä muuntaa sen normaaleiksi metodikutsuiksi. Linqin oppimista voi edistää tarkastelemalla käännettyä sovellusta esimerkiksi sdk-kehittäjäpaketin mukana tulevalla ILDASM-työkalulla tai vaikkapa mainiolla Lutz Roederin Reflector-työkalulla. Linq-kyselyt ovatkin sekä luokkakirjaston että kääntäjän tarkkaa yhteispeliä.

Linqin taustalla käytetään monia uusia C# 3.0 -kieleen lisättyjä ominaisuuksia. Esimerkiksi anonyymit tietotyypit, lambda-lausekkeet ja uusi var-avainsana ovat tarpeen, jotta linq toimisi halutulla tavalla. Kyselysyntaksista muodostetaan erityinen lausepuu, joita on mahdollista rakentaa jopa ajonaikaisesti. Näin linqiä voidaan käyttää hyvinkin vaativissa tilanteissa.

Microsoft on oman ilmoituksensa mukaan käyttänyt paljon aikaa linq-kyselyiden pitämiseen suorituskykyisinä, mutta tarkkoja lukuja on vaikea löytää. Suorituskyky on varmasti jonkin verran raakaa Ado.net-suorituskykyä jäljessä, mutta testien mukaan erot eivät ole merkittäviä tyypillisissä sovelluksissa. Linq-kyselyiden käyttö ei estä käyttämästä myös perinteisiä Ado.net-kyselyitä, joten tarvittaessa sovelluksessa voidaan käyttää molempia.

Listaus 1
int[] numerot = { 4, 8, 12, 7, 3, 5, 10, 2, 9, 11, 6 };
var parilliset = from n in numerot
where n % 2 == 1
orderby n ascending
select n;
foreach (int parillinen in parilliset)
{
MessageBox.Show(parillinen.ToString());
}

Listaus 2
NorthwindDataClassesDataContext context =
new NorthwindDataClassesDataContext();
string customerName = ”Bottom-Dollar Markets”;
var orders = from order in context.Orders
join customer in context.Customers
on order.CustomerID equals
customer.CustomerID
where customer.CompanyName.
StartsWith(customerName)
select order;
foreach (var order in orders)
{
MessageBox.Show(
order.OrderDate.Value.ToShortDateString ());
}

Listaus 3
NorthwindDataClassesDataContext context =
new NorthwindDataClassesDataContext();
var customerOrders = from c in context.
Customers
select new {
c.CompanyName,
c.Orders.Count
};
foreach (var order in customerOrders)
{
MessageBox.Show(order.CompanyName + ”: ” +
order.Count + ” order(s).”);
}

Listaus 4

string filename = @”C:\XML\Orders.xml”;
var orders = XElement.Load(filename);
var ids = from order in
orders.Elements(”order”).
Elements(”id”)
select order;
foreach (var id in ids)
{
MessageBox.Show(id.Value);
}

Tagit: -
Lähetä Tulosta Tilaa RSS-syöte
Takaisin ylös

Tietokone 5/2012 julkaisupäivä 16.5.2012

Katse näyttöön

Edessäsi ole oleva näyttö on kovin erilainen kuin ei-kovin-kauan-sitten yleisimmin käytetyt kuvaputkinäytöt. Eikä kehitys pysähdy. Toukokuun Tietokoneessa katsotaan näyttöjen tulevaisuuteen ja myös testataan terävät 27-tuumaiset näytöt. Ensituntumaa otetaan tulevan Windowsin palvelinversiosta. Vinkkejä tarjotaan muun muassa pc-hygienian ylläpitoon.

Takaisin ylös

Tietokone 9/2008

Lehden uusimmat numerot ovat vain tilaajien luettavissa. Vanhemmat numerot ovat vapaasti kaikkien luettavissa.

Voit myös ostaa Tietokoneen digilehden.

TTL ry
Pieni kirjapuoti
Takaisin ylös