32
MICROSOFT LINQ Susanna Salonen Huhtikuu 2008

MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

  • Upload
    buicong

  • View
    227

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

MICROSOFT LINQ

Susanna Salonen

Huhtikuu 2008

Page 2: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 3: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 4: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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-

Page 5: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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:

Page 6: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 7: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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" )

Page 8: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 9: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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).

Page 10: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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.

Page 11: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 12: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 13: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 14: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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)()

Page 15: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 16: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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)

Page 17: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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.

Page 18: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 19: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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.

Page 20: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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()

Page 21: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

20

KUVIO 14. Helpompi tapa tehdä haku tietokannasta.

17. Aja ohjelma F5:lla. Kuviossa 15 on haun tulos.

KUVIO 15. Haun tulos

Page 22: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 23: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 24: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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).

Page 25: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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()

Page 26: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 27: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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" _

Page 28: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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.

Page 29: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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).

Page 30: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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

Page 31: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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ä.

Page 32: MICROSOFT LINQ - LabraNetstudent.labranet.jamk.fi/~huojo/opetus/raportit/Linq_Salonen.pdf · LINQ To SQL:n käyttäminen edellyttää, että käytössä tietokanta on täysin relaa-tiopohjainen

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.