MICROSOFT LINQ
Susanna Salonen
Huhtikuu 2008
1
SISÄLTÖ
1 TIIVISTELMÄ...................................................................................................... 2
2 JOHDANTO .......................................................................................................... 3
3 MIKÄ ON LINQ? ................................................................................................. 3
4 LINQ:N OSA-ALUEET ........................................................................................ 5
4. 1 LINQ to Objects............................................................................................. 6
4. 2 LINQ to ADO.NET ........................................................................................ 6
4.3 LINQ to XML ................................................................................................. 7
5 OBJECT-RELATIONAL MAPPING (ORM) ..................................................... 7
6 LINQ TO SQL....................................................................................................... 9
6.1 LINQ To SQL käytännössä - osa 1 ................................................................ 9
6.2 LINQ To SQL käytännössä - osa 2 .............................................................. 21
7 LISÄTIETOJA LINQ:STA ................................................................................ 28
8 YHTEENVETO .................................................................................................. 29
LÄHTEET .............................................................................................................. 31
2
1 TIIVISTELMÄ
Työn tavoitteena oli selvittää, mikä on Microsoft LINQ, mistä eri osa-alueista se koos-
tuu ja kuinka sitä voidaan hyödyntää kyselyiden tekemisessä tietokantaan, XML -
muodossa olevaan dataan tai muistissa oleviin objekteihin. Tavoitteena oli myös etsiä
käytännön kokemuksia LINQ:n käytöstä ohjelmistoprojekteissa, ja listata sen pohjalta
LINQ:n hyviä ja huonoja puolia. Lisäksi kerättiin linkkejä erilaisiin LINQ:ta käsitte-
leviin sivustoihin, joiden avulla on helppo lähteä tutustumaan LINQ -tekniikkaan sy-
vemmin. Selvityksessä LINQ:ta verrattiin perinteiseen sulautettuun SQL:ään. Selvi-
tystyö tehtiin pitkälti LINQ:sta julkaistun sähköisen materiaalin pohjalta etsimällä
tietoa edellä esitettyihin asioihin.
Selvitystyön perusteella voidaan todeta, että LINQ:ssa on monia hyviä puolia verrat-
tuna perinteiseen sulautetun SQL:n käyttöön ohjelmoinnissa ja sillä voidaan tehdä
ohjelmointityöstä paljon aiempaa tehokkaampaa ja ohjelmakoodista ylläpidettäväm-
pää. Selvitystyö kuitenkin osoitti, että tehokkuutta ei saada paranemaan, ellei LINQ:ta
osata hyödyntää oikeaoppisesti tai tuntematta sen rajoitteita. Jos LINQ:ta käytetään
ainoastaan sulautetun SQL:n korvikkeena, jäävät uuteen tekniikkaan siirtymisestä
syntyvät hyödyt vähäisiksi
3
2 JOHDANTO
Tämä selvitysraportti tehtiin keväällä 2008 Jyväskylän ammattikorkeakoulun tietokan-
tojen suunnittelu ja tietokantojen hallinta -kurssien harjoitustyönä. Selvitysraportissa
perehdyttiin Microsoftin tekniikkaan yhdistää olio-ohjelmointi ja relaatiotekniikat.
Tämä tekniikka nimeltä LINQ (Language Integrated Query) julkaistiin lopullisesti
Microsoft Visual Studio 2008:n ja .NET Framework 3.5:n mukana. LINQ mahdollis-
taa erilaisten tietolähteiden, kuten tietokannan, xml -tiedostojen tai itse luotujen olioi-
den käytön ohjelmakoodissa samanlaisella hakusyntaksilla. Tähän selvitysraporttiin
pyrittiin kokoamaan LINQ:n hyviä puolia, ja kertomaan esimerkein, kuinka LINQ:ta
voidaan hyödyntää ohjelmoinnissa.
Tarvittava ympäristö
LINQ kokeiluiden tekemistä varten asennettuna täytyy olla Microsoft Visual Studio
2008 ja .NET Framework 3.5. Ennen kehitysympäristön asentamista, kannattaa asen-
taa .NET Framework 3.5 osoitteesta:
http://www.microsoft.com/downloads/details.aspx?FamilyID=333325FD-AE52-
4E35-B531-508D977D32A6&displaylang=en (viitattu 11.4.2008). Visual Studio
2008 Express version voi ladata osoitteesta:
http://www.microsoft.com/express/default.aspx (viitattu 11.4.2008). Opiskelijat on
mahdollisuus ladata myös Visual Studio 2008:n Professional -versio Microsoftin
DreamSparkista: https://downloads.channel8.msdn.com (viitattu 11.4.2008). Sekä
kehitysympäristön, että Framework:n voi ladata ilmaiseksi.
3 MIKÄ ON LINQ?
LINQ on ohjelmointimalli, joka tarjoaa täysin uudenlaisen tavan kyselyiden tekemi-
seen ja datan käsittelyyn Microsoftin .NET –projekteissa. LINQ pyrkii eroon tavalli-
sen sulautetun sql -kielen mukanaan tuomista rajoitteista ja samalla kasvattamaan oh-
4
jelmointityön tuottavuutta, tarjoamalla lyhyemmän, mielekkäämmän ja ilmaisuvoi-
misen syntaksin datan käsittelyyn. (Pialorsi & Russo 2007, 2.)
Tässä esimerkiksi tyypillinen tilanne, jossa ohjelmallisesti haetaan kaikki suomalais-
ten yritysasiakkaiden nimet tietokannasta:
var query =from c in Customerswhere c.Country == "Finland"select c.CompanyName;
Kyselystä voi heti huomata eron normaaliin sql:n syntaksiin. Sql -kyselyssä luetellaan
ensin tietokannan sarakkeet, jotka kyselyyn otetaan mukaan, ja vasta tämän jälkeen
kerrotaan taulun nimi, josta tiedot haetaan. LINQ:ssa kyselyä lähdetään muodosta-
maan valitsemalla ensin taulu, ja ehdot joiden perusteella tietoa taulusta haetaan. Vas-
ta tämän jälkeen valitaan tarpeelliset sarakkeet. Näin kyselyyn voidaan rajata juuri
tarpeellinen – ja vain tarpeellinen – tulosjoukko, mikä helpottaa ohjelmointityötä
huomattavasti.
Edellisen kyselyn tulokset ovat suoraan merkkijonoina, jotka saadaan tulostettua esim.
foreach -rakenteella:
foreach (string name in query) {
Console.WriteLine(name); }
Tällä samalla tavalla voidaan tehdä kysely niin SQL Server -tietokantaan, DataSet:iin,
muistissa oleviin taulukoihin tai moneen muun laiseen dataan. Esimerkiksi Customers
voisi olla kokoelma objekteja:
Customer[] Customers;
Tai esimerkiksi DataTable DataSet:n sisällä:
DataSet ds = GetDataSet(); DataTable Customers = ds.Tables["Customers"];
Customers voisi olla luokka, joka kuvaa fyysisen relaatiotietokannan taulun:
5
DataContext db = new DataContext(ConnectionString); Table<Customer> Customers = db.GetTable<Customer>();
Ja se voi olla käsitteellinen luokka, joka on mapattuna suoraan relaatiotietokantaan:
NorthwindModel dataModel = new NorthwindModel(); ObjectQuery<Customer> Customers = dataModel.Customers;
LINQ mahdollistaa kyselyn tekemisen yhtäaikaa monen tyyppiseen dataan. Voidaan
esim. yhdistää muistissa olevien objektien tietoja ja tietokannasta haettavia tietoja
keskenään ja kohdistaa yhdistettyyn dataan haluttuja hakuja. Tämä on erittäin joustava
tapa käsitellä tietoa, mutta vielä tällähetkellä äärimmäisen tehoton. Joten kaupallista
sovellusta ohjelmoitaessa on tarkkaan mietittävä kannattaako mahdollisuutta
erityyppisen datan yhdistämiseen hyödyntää. (Launiala 2008.)
4 LINQ:N OSA-ALUEET
Kuviossa 1 on kuvattu, LINQ:n eri osa-alueet, joita ovat LINQ to Objects, LINQ to
ADO.NET ja LINQ to XML. LINQ to ADO.NET jakautuu vielä kolmeen aliryhmään,
joita ovat LINQ to sql, LINQ to DataSet ja LINQ to Entities.
KUVIO 1. LINQ .NET Framework 3.5:ssa
6
4. 1 LINQ to Objects
LINQ to Objects käsittää nimensä mukaisesti oliokokoelmien käsittelyn ohjelmakoo-
dissa. Olioiden ei tarvitse olla itse luotuja, kuten seuraavasta ohjelmakoodista voidaan
nähdä. Ohjelmakoodissa haetaan kaikki käyttöjärjestelmän Temp -hakemistossa olevat
tiedostot, joiden koko on yli 10000 tavua ja järjestetään haun tulokset koon mukaan.
(Pialorsi & Russo 2007, 15.)
string tempPath = Path.GetTempPath(); DirectoryInfo dirInfo = new DirectoryInfo(tempPath);
var query =from f in dirInfo.GetFiles()where f.Length > 10000orderby f.Length descendingselect f;
4. 2 LINQ to ADO.NET
LINQ to ADO.NET on LINQ:n kiinnostavin osa tietokantojen näkökulmasta. Kuten
edellä todettiin, LINQ to ADO.NET jakautuu edelleen kolmeen osaan. LINQ to Sql
hallitsee mappauksen ohjelmakoodin ja fyysisen tietokantataulun välillä. LINQ to
Entities on hyvin samankaltainen kuin LINQ to Sql. Sen sijaan, että käytettäisiin suo-
raa fyysistä tietokantaa, LINQ to Entities käyttää abstraktia Entity Data Model:a
(EDM). Tuloksena on abstrakti taso, joka erotettu fyysisestä datatasosta. LINQ to
DataSet taas on juuri sitä, mistä nimikin kertoo, eli tapa tehdä kysellä tietoja Data-
Set:sta LINQ:ta käyttäen. LINQ to ADO.NET:a esitellään vielä myöhemmin lisää.
Tässä esimerkki LINQ to DataSet:sta, jossa on yhdistetty kahden DataTable:n sisältö.
(Pialorsi & Russo 2007, 15 - 16.)
DataSet ds = LoadDataSetUsingDataAdapter(); DataTable orders = ds.Tables["Orders"]; DataTable orderDetails = ds.Tables["OrderDetails"];
var query =from o in orders.AsEnumerable()join od in orderDetails.AsEnumerable()on o.Field<int>( "OrderID" ) equals od.Field<int>("OrderID")into orderLineswhere o.Field<DateTime>( "OrderDate" ).Year >= 1998orderby o.Field<DateTime>( "OrderDate" ) descendingselect new { OrderID = o.Field<int>( "OrderID" ),
OrderDate = o.Field<DateTime>( "OrderDate" ), Amount = orderLines.Sum( od => od.Field<decimal>( "UnitPrice" )
7
* od.Field<short>( "Quantity" ) ) };
4.3 LINQ to XML
LINQ to XML tarjoaa hieman erilaisen tavan XML -muotoisen datan kanssa työsken-
telyyn, kuten XML -datasta tehtäviin kyselyihin ja XML-datan muokkaukseen. .NET
–kielistä erityisesti Visual Basic 9.0 sopii erinomaisesti XML –datan käsittelyyn, kos-
ka kieleen on sisällytetty XML:n literaaleja. Tämä ominaisuus tekee hankalasta XML-
tiedostojen käsittelystä paljon helpompaan. Esimerkki, jossa XML -dataan tehdään
kysely LINQ:lla: (Pialorsi & Russo 2007, 16.)
var customersFromXml =from c in xmlCustomers.Elements("customer")where (String)c.Attribute("country") == "Italy"orderby (String)c.Element("name")select new
{ Name = (String)c.Element("name"), City = (String)c.Attribute("city") };
foreach (var customer in customersFromXml) {
Console.WriteLine(customer); }
5 OBJECT-RELATIONAL MAPPING (ORM)
LINQ ei ole pelkästään kyselykieli vaan täysverinen olio-relaatio -muunnin (object
relational mapper). On turhaa käyttää LINQ:ta pelkästään sulautetun SQL:n korvik-
keena hyödyntämättä sen ominaisuuksia tietokannan käsittelyssä. (Launiala 2008.)
Mikä sitten on olio-relaatio -muunnos? Käytännössä se tarkoittaa olioiden automaat-
tista tallentamista ja lataamista relaatiotietokantaan eli tavanomaisesta tietokannan
käsittelystä tulee olioiden ohjelmointia. Olio-relaatio -muuntimia käyttämällä ei oh-
jelmakoodiin tarvitse enää upottaa SQL -lauseita, koska muunnin kirjoittaa ne itse.
Kuviossa 2 nähdään, kuinka tuottavuus tietokantaan pohjautuvien sovellusten teossa
8
huononee, jos käytetään normaalia SQL:ää, eikä puhdasta olio-ohjelmointia - tuotta-
vuudessa palataan kahdeksankymmentä luvun tasolle. (Bernstein 1997, 233 – 242.)
KUVIO 2. Objekti-relaatio -muuntimen hyöty
Kun käytetään olio-relaatiomuunnosta, voidaan ohjelmoida aidosti olio-ohjelmoinnin
sääntöjen mukaan, ohjelmakoodin määrää pienenee, koodin ylläpidettävyys kasvaa ja
ohjelmointivirheiden, sekä kantaan asti menevän huonon ja väärän datan määrä vähe-
nee. Samoin vältytään kahden ”ohjelmointikielen” käyttämistä samassa sovelluksessa
(Kalima 2004).
Olio-relaatio -muunnosta kannattaa käyttää sovelluksissa, jotka perustuvat täysin tie-
tokannan käyttöön – tämän tapaisia ovat suurin osa liiketoimintaa tukevista ja ohjaa-
vista sovelluksista. Yleensä sovelluksen pystyy tekemään tehokkaasti ORM -
tekniikkaa hyödyntäen. Jos tehokkuus osoittautuu pullonkaulaksi, voidaan osa kyse-
lyistä tehdä normaalia SQL -syntaksia käyttäen, esim. tilanteessa, jossa halutaan opti-
moida käsin tietokantahakuja (Kalima 2004).
9
6 LINQ TO SQL
LINQ To SQL on Microsoftin tapa toteuttaa olio-relaatio -muunnin. LINQ To SQL
tuo tarjoaa kaikki edellisessä luvussa esille tulleet olio-relaatio -muuntimen hyvät puo-
let. LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-
tiopohjainen. Tällä hetkellä tukea ei myöskään löydy kuin Microsoft SQL Servereille,
joten tämä hieman rajoittaa LINQ To SQL:n käyttöä kaupallisissa sovelluksissa.
(Launiala 2008.)
6.1 LINQ To SQL käytännössä - osa 1
Seuraavassa on esimerkkiharjoitus, jolla avulla voi tutustua LINQ To SQL:ään käy-
tännön kautta. Esimerkin runko on englanninkielisenä (Learning by Walkthroughs
(LINQ to SQL)) osoitteessa: http://msdn2.microsoft.com/en-us/library/bb399349.aspx
(viitattu 13.4.2008).
1. Luo koneellesi harjoitusta varten kansio: c:\linqtest.
2. Lataa Northwind -tietokanta osoitteesta: http://msdn2.microsoft.com/en-
us/library/bb399411.aspx (viitattu 12.4.2008) vaiheessa 1 luomaasi kansioon. Huom.
jos koneellasi ei ole SQL Serveriä, lataa ja asenna myös SQL Server Express Edition.
Sen löydät Microsoftin Download Centerista: http://www.microsoft.com/downloads/
(viitattu 12.4.2008).
2. Käynnistä Microsoft Visual Studio 2008 ja luo uusi VB.net -projekti. Katso mallia
kuviosta 3.
10
KUVIO 3. Uuden projektin luominen
3. Lisätään tarvittavat viittaukset. Avaa Solution Explorer, paina projektin nimen pael-
la hiiren oikeaa painiketta, ja valitse References ja tämän jälkeen Add Reference. Liitä
projektiin System.Data.Linq ja System.Windows.Forms. Katso mallia kuviosta 4.
KUVIO 4. Viittausten lisääminen projektiin
11
4. Kirjoita ennen moduulin alkua seuraavat rivit (katso mallia kuviosta 5):
Imports System.Data.LinqImports System.Data.Linq.MappingImports System.Windows.Forms
KUVIO 5. Tarvittavien kirjastojen lisääminen ohjelmaan
5. Lisätään uusi luokka, joka on mapattuna tietokannan Customers -tauluun. Lisää
seuraavat rivit Sub Main():n alapuolelle (katso mallia kuviosta 6):
<Table(Name:="Customers")> _Public Class Customer
Private _CustomerID As String
12
KUVIO 6. Tietokantaan mapatun luokan lisääminen ohjelmaan
6. Lisätään luodun Customer -luokan sisälle viittaukset Customers -taulun sarakkei-
siin. Katso mallia kuviosta 7.
Private _CustomerID As String <Column(IsPrimaryKey:=True, Storage:="_CustomerID")> _
Public Property CustomerID() As StringGet
Return Me._CustomerIDEnd GetSet(ByVal value As String)
Me._CustomerID = valueEnd Set
End Property
Private _City As String <Column(Storage:="_City")> _
Public Property City() As StringGet
Return Me._CityEnd GetSet(ByVal value As String)
Me._City = valueEnd Set
End Property
13
KUVIO 7. Customers -taulun sarakkeiden lisääminen ohjelmakoodiin
7. Lisätään tietokanta -yhteys. Kirjoita seuraavat rivit Sub Main -metodin sisään (kat-
so mallia kuviosta 8):
' Use a connection string.Dim db As New DataContext _
("c:\linqtest\northwnd.mdf")
' Get a typed table to run queries.Dim Customers As Table(Of Customer) = _
db.GetTable(Of Customer)()
14
KUVIO 8. Tietokanta -yhteyden lisääminen ohjelmaan
8. Tehdään yksinkertainen kysely tietokantaan. Kirjoita seuraavat rivit Sub Main -
metodiin Table(Of Customer) -määrityksen alapuolelle (katso mallia kuviosta 9).
' Attach the log to show generated SQL in a console window. db.Log = Console.Out
' Query for customers in London.Dim custQuery = _
From cust In Customers _Where cust.City = "London" _Select cust
15
KUVIO 9. Kyselyn lisääminen ohjelmaan
9. Lisätään ohjelmakoodi tietokantakyselyn tulosten esittämiseksi MessageBox:ssa.
Kirjoita seuraavat rivit Sub Main -metodin loppuun (katso mallia kuviosta 10):
' Format the message box.Dim msg As String = "", title As String = "London
customers:", _ response As MsgBoxResult, style As MsgBoxStyle = _ MsgBoxStyle.Information
' Execute the query.For Each custObj In custQuery
msg &= String.Format(custObj.CustomerID & vbCrLf)Next
' Display the results. response = MsgBox(msg, style, title)
16
KUVIO 10. Tietokantahaun tulostaminen MessageBoxiin
10. Aja ohjelma F5:lla. Kuviossa 11 on haun tulokset.
KUVIO 11. Tietokantahaun tulokset
11. Lisätään uusi luokka nimeltä Order. Kirjoita seuraavat rivit ohjelmakoodiin Cus-
tomer -luokan perään. Huomaa, että ohjelmakoodissa määritellään yhteys Orders -
taulun CustomerID -sarakkeen ja Customers -taulun CustomerID:n välille.
17
<Table(Name:="Orders")> _Public Class Order
Private _OrderID As IntegerPrivate _CustomerID As StringPrivate _Customers As EntityRef(Of Customer)
Public Sub New()Me._Customers = New EntityRef(Of Customer)()
End Sub
<Column(Storage:="_OrderID", DbType:="Int NOT NULL IDENTITY",_ IsPrimaryKey:=True, IsDBGenerated:=True)> _
Public ReadOnly Property OrderID() As IntegerGet
Return Me._OrderIDEnd Get
End Property' No need to specify a setter because IsDBGenerated is true.
<Column(Storage:="_CustomerID", DbType:="NChar(5)")> _Public Property CustomerID() As String
GetReturn Me._CustomerID
End GetSet(ByVal value As String)
Me._CustomerID = valueEnd Set
End Property
<Association(Storage:="_Customers", ThisKey:="CustomerID")> _Public Property Customers() As Customer
GetReturn Me._Customers.Entity
End GetSet(ByVal value As Customer)
Me._Customers.Entity = valueEnd Set
End PropertyEnd Class
12. Kirjoita seuraavat rivit Customer –luokkaan merkiksi Customers ja Orders -
taulun välisestä yhteydestä (katso mallia kuviosta 12):
Private _Orders As EntitySet(Of Order)
Public Sub New()Me._Orders = New EntitySet(Of Order)()
End Sub
<Association(Storage:="_Orders", OtherKey:="CustomerID")> _Public Property Orders() As EntitySet(Of Order)
GetReturn Me._Orders
End GetSet(ByVal value As EntitySet(Of Order))
Me._Orders.Assign(value)End Set
End Property
18
KUVIO 12. Yhteyden merkitseminen Customers- ja Orders –taulujen välille
13. Kirjoita Sub Main -metodiin kysely, jossa haetaan tietoa Orders –taulusta suoraan
Customer olion kautta:
' Query for customers who have no orders.Dim custQuery = _
From cust In Customers _Where Not cust.Orders.Any() _Select cust
Dim msg As String = "", title As String = _"Customers With No Orders", response As MsgBoxResult, _
style As MsgBoxStyle = MsgBoxStyle.Information
For Each custObj In custQuery msg &= String.Format(custObj.CustomerID & vbCrLf)
Next response = MsgBox(msg, style, title)
14. Aja ohjelma F5:lla. Kuviossa 13 on haun tulokset.
19
KUVIO 13. Haun tulokset
15. Lisätään Sub Main –metodin perään uusi luokka Northwind joka on peritty
DataContext –luokasta. Tällätavoin tietokannan taulujen käyttö ohjelmassa on
helpompaa ja yksinkertaisempaa.
Public Class NorthwindInherits DataContext' Table(Of T) abstracts database details per' table/data type.Public Customers As Table(Of Customer)Public Orders As Table(Of Order)
Public Sub New(ByVal connection As String)MyBase.New(connection)
End SubEnd Class
16. Muutetaan Main Sub –metodia käyttämään edellä luotua Northwind -luokkaa
(katso mallia kuviosta 14):
' Use a connection string.Dim db As New Northwind _
("C:\Linqtest\northwnd.mdf")
' Query for customers from Seattle.Dim custs = _
From cust In db.Customers _Where cust.City = "Seattle" _Select cust
For Each custObj In custs Console.WriteLine("ID=" & custObj.CustomerID)
Next
' Freeze the console window. Console.ReadLine()
20
KUVIO 14. Helpompi tapa tehdä haku tietokannasta.
17. Aja ohjelma F5:lla. Kuviossa 15 on haun tulos.
KUVIO 15. Haun tulos
21
6.2 LINQ To SQL käytännössä - osa 2
Seuraavassa on kuvattu, kuinka sql -tietokannassa olevaa tietoa voidaan muuttaa.
1. Generoidaan VB.NET tiedosto tietokannan pohjalta SQLMETAL –ohjelmaa käyt-
täen. SQLMETAL -ohjelmasta löytyy tietoa Microsoftin sivuilta:
http://msdn2.microsoft.com/en-us/library/bb386987.aspx. Oletuksena ohjelma löytyy
koneelta kansiosta: drive:\Program Files\Microsoft SDKs\Windows\vn.nn\bin (katso
kuvio 16).
KUVIO 16. SQLMETAL -ohjelman sijainti
2. Aja komentokehotteessa seuraava rivi (katso mallia kuviosta 17):
sqlmetal /code:"c:\linqtest\northwind.vb" /language:vb "C:\linqtest\northwnd.mdf"
/pluralize
22
KUVIO 17. SQLMETAL -ohjelman käyttäminen
2. Tee uusi VB.NET -projekti. Katso mallia kuviosta 18.
KUVIO 18. Uuden VB.NET -projektin luominen
23
3. Lisää viittaus ”System.Data.Linq” projektiin (Solution Explorer > References >
Add Reference (katso mallia kuviosta 19). Ja kirjoita ennen Module1:sta seuraavat
rivit:
Imports System.Data.LinqImports System.Data.Linq.Mapping
KUVIO 19. Tarvittavien kirjastojen tuominen ohjelmaan
3. Liitä SQLMETAL -ohjelmalla generoitu ohjelmakoodi projektiin valitsemalla pro-
jektin nimen päällä Add Existing Item ja valitsemalla northwind.vb -tiedosto (katso
mallia kuviosta 20).
24
KUVIO 20. Generoidun ohjelmakoodin liittäminen projektiin
4. Luodaan tietokantayhteys. Kirjoita seuraavat rivit Sub Main -metodin sisään (katso
mallia kuviosta 21):
' Use a connection string, but connect to' the temporary copy of the database.Dim db As New Northwnd _
("C:\Linqtest\northwnd.mdf")
' Keep the console window open after activity stops. Console.ReadLine()
25
KUVIO 21. Tietokantayhteyden luominen
5. Kirjoita seuraavat rivit Sub Main -metodiin ennen Console.ReadLine() –riviä. Oh-
jakoodi luo uuden rivin Customers -tauluun ja tulostaa taulussa olevat CustomerID:t,
jotka sisältävät merkkijonon CA, ennen uuden rivin lisäystä tietokantaan. Katso mallia
kuviosta 22.
' Create the new Customer object.Dim newCust As New Customer()
newCust.CompanyName = "AdventureWorks Cafe" newCust.CustomerID = "A3VCA"
' Add the customer to the Customers table. db.Customers.InsertOnSubmit(newCust)
Console.WriteLine("Customers matching CA before insert:")
Dim custQuery = _From cust In db.Customers _Where cust.CustomerID.Contains("CA") _Select cust
For Each cust In custQuery Console.WriteLine("Customer ID: " & cust.CustomerID)
Next
26
KUVIO 22. Ohjelmakoodi, joka lisää uuden rivin Customers -tauluun
6. Aja ohjelma F5:lla. Kuviossa 23 on haun tulos.
KUVIO 23. Haun tulos
7. Kirjoita seuraavat rivit, jotka päivittävät ContactName:n Customers -taulussa Cus-
tomerID:n perusteella Sub Main -metodiin ennen Console.ReadLine() –riviä:
Dim existingCust = _ (From cust In db.Customers _
Where cust.CustomerID = "ALFKI" _
27
Select cust).First()
' Change the contact name of the customer. existingCust.ContactName = "New Contact"
8. Kirjoita seuraavat rivit, jotka poistavat rivin Order Details -taulusta Sub Main -
metodiin ennen Console.ReadLine() -riviä:
' Access the first element in the Orders collection.Dim ord0 As Order = existingCust.Orders(0)
' Access the first element in the OrderDetails collection.Dim detail0 As OrderDetail = ord0.OrderDetails(0)
' Display the order to be deleted. Console.WriteLine _ (vbCrLf & "The Order Detail to be deleted is: OrderID = " _ & detail0.OrderID)
' Mark the Order Detail row for deletion from the database. db.OrderDetails.DeleteOnSubmit(detail0)
9. Kirjoita seuraava rivi, joka vie muutokset tietokantaan Sub Main -metodiin ennen
Console.ReadLine() -riviä:
db.SubmitChanges()
10. Kirjoita seuraavat rivit Sub Main -metodiin ennen Console.ReadLine() –riviä.
Näin ohjelma tulostaa tilanteen tietokannassa edellisen lisäyksen, päivityksen ja pois-
ton jälkeen.
Console.WriteLine(vbCrLf & "Customers matching CA afterupdate:")
Dim finalQuery = _From cust In db.Customers _Where cust.CustomerID.Contains("CA") _Select cust
For Each cust In finalQuery Console.WriteLine("Customer ID: " & cust.CustomerID)
Next
11. Aja ohjelma F5:lla. Kuviossa 24 on ohjelman tulostamat tiedot.
28
KUVIO 24. Ohjelman tulostamat tiedot.
Edellä kuvattujen esimerkkien avulla, pääsee helposti ja turvallisesti tutustumaan
LINQ To SQL:n perusteisiin. Näiden jälkeen voi kokeilla konsoliohjelma sijasta pie-
nen Windows -sovelluksen tekoa: http://msdn2.microsoft.com/en-
us/library/bb386955.aspx (viitattu 13.4.2008).
7 LISÄTIETOJA LINQ:STA
Koska LINQ on varsin uusi tekniikka, ei suomenkielistä materiaalia aiheesta juuri
löydy. Helpoiten LINQ:n saloihin pääsee tutustumaan http://www.asp.net/learn/linq-
videos/ -sivuston videoiden avulla (viitattu 11.4.2008). Lisäksi artikkeli
http://visualstudiomagazine.com/features/article.aspx?editorialsid=1340 antaa hyvän
yleiskuvan aiheesta (viitattu 11.4.2008). Jos fokuksena on kaikki mahdollinen
LINQ:sta A:sta Ö:hön, niin helposta tiedonjanoon löytyy Microsoftin omilta LINQ -
projektin sivuilta:
http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx (viitattu 11.4.2008).
Scott Guthrie:n blogista löytyy todella hyvää lisätietoa ja vinkkejä. Scottin blobi on
muutoinkin loistava ajankohtaisen tiedon lähde:
http://weblogs.asp.net/scottgu/archive/tags/LINQ/default.aspx (viitattu 11.4.2008).
29
Microsoft Visual Studio 2008:sta ja .NET 3.5:sta löytyy ilmainen Training Kit –
materiaali osoitteesta:
http://www.microsoft.com/downloads/details.aspx?FamilyID=8BDAA836-0BBA-
4393-94DB-6C3C4A0C98A1&displaylang=en (viitattu 11.4.2008). Materiaalista löy-
tyy myös harjoituksia LINQ:sta. On huomioitava, että harjoitukset vaativat toimiak-
seen mm. SQL Server 2005:n.
8 YHTEENVETO
Tämän selvityksen tarkoituksena oli selvittää, mikä LINQ, mistä osista se koostuu ja
onko sen käytöstä hyötyä. Lisäksi pyrittiin etsimään käytännön kokemuksia LINQ:n
käytöstä oikeissa ohjelmistoprojekteissa ja kokoamaan erilaisia lähteitä, joiden avulla
pääsee tutustumaan LINQ:n sielunelämään ja mahdollisuuksiin syvällisemmin. Käy-
tännön kokemuksia LINQ:sta voi kuunnella ProtonIT Oy:n konsultti Kalle Launialan
Microsoft Developer Days 2008:ssa pitämästä luennosta (Launiala 2008).
Tämä selvitysraportti on pieni pintaraapaisu LINQ:n mahdollisuuksiin, koska LINQ:ta
voi hyödyntää monenlaisten tietolähteiden käytössä. Ehkä suurin uudistus verrattuna
vanhaan, on objekti-relaatio muunnoksen mahdollisuus LINQ To SQL:ää käyttäen,
mistä johtuen selvitysraporttiin sisällytettyjen harjoitusten kohteeksi valittiin juuri
LINQ To SQL. Kaikki linkit LINQ:sta kertoviin lisämateriaaleihin pyrittiin valitse-
maan mahdollisimman hyvin itseopiskeluun sopiviksi.
Ongelmana selvitysraportin teossa oli suomenkielisen materiaalin puute. Koska mate-
riaalia ei juuri suomeksi löytynyt, oli englanninkielisten termien kääntäminen suo-
meksi varsin haasteellista.
Työ kuitenkin osoitti, että LINQ:ssa ja etenkin LINQ To SQL:ssä on potentiaalia. Oh-
jelmointityössä on ollut vuosikausia pyrkimyksenä päästä entistä suurempaan tuotta-
vuuteen vähentämällä tarvittavan ohjelmakoodin määrää ja keskittämällä sitä niin,
ettei yhden asian korjaus aiheuta muutoksia moneen paikkaan. LINQ To SQL pyrkii
osaltaan nostamaan tätä tehokkuutta ja vähentämään tietokantakyselyissä tapahtuvia
virheitä. Seuraava askel otetaan, kun LINQ To SQL:ää voidaan käyttää muidenkin
30
kuin Microsoft SQL Server -tietokantojen kanssa. Valtava määrä ohjelmistoyrityksiä
ympäri maailmaa, kehittää ohjelmistoja Windows alustalle, joten LINQ ei varmasti
tule katoamaan minnekään – nyt ollaan vasta kehityksen alkumetreillä.
31
LÄHTEET
Bernstein, L. 1997. Software Investment Strategy. Bell Labs Technical Journal,
Summer 1997, 233 - 242.
Kalima, L. 2004. SQL Server 2005 Sovelluskehitysseminaari. Viitattu 11.4.2008.
http://seminaarit.codezone.fi/video/09122004/1/LauriKalima.ppt
Launiala, K. 2008. Linq to SQL käytännössä. Viitattu 11.4.2008.
http://www.codezone.fi, Developer Days 2008 esitykset Codezonessa, LINQ to SQL
käytännössä: käyttöönotto, sovellusrakenne ja työkalut.
Pialorsi P. & Russo M. 2007. Introducing Microsoft Linq. Redmond: Microsoft Press.