Startujte VWD i pocecemo sa primjerima LINQ operacija.
Otvorite default.aspx fajl i predjite na kode (F7). Pocecemo sa tipkanjem u Page_Load event handler-u, u ovom slucaju necu demonstrirati data binding jer je ovaj post o LINQ-u i pretpostavljem da citalac vec ima osnovna znaja iz ASP.NET-a.
Prvi zadatak je da kreiramo novu instancu nase MaliDucanDataContext klase (class), koja ce nam sluziti da obavimo sve LINQ operacije:
C#:
//Nova instanca DataContext klase
MaliDucanDataContext dc = new MaliDucanDataContext();
VB:
'Nova instanca DataContext klase
Dim dc As MaliDucanDataContext = New MaliDucanDataContext
Data za jedan proizvod iz baze podataka
Posto imamu instancu nase DataContext klase (class) sada mozemo da dobijemo data za jedan proizvod iz baze podataka:
C#:
//Data za jedan proizvod
var prod = dc.Proizvods.Single(p => p.ProizvodIme == "Pereca");
VB:
'Data za jedan proizvod
Dim prod = (From p In dc.Proizvods Where p.ProizvodIme = "Pereca").Single
Primjeticete da kada kucate dobijate sugestiju u - "intelisense" opcijama, LINQ to SQL je potpuno integrisan u VB i C# jezike i vecina gresaka (bugs) ce da budu otkrivene u dizajneru ili prilikom kompajliranja.
U ovom trenutku cemo malo da se vratimo na prvi post u seriji. nove dodatke .NET jezicima i analiziramo konstrukciju LINQ operacije. Primjeticete novu kljucnu rijec u C# var, koju slijedi ime variable. U VB koristimo standardnu kljucnu rijec Dim ali u obje deklaracije nemamo variable type. Variable type je automatski pripisana na osnovu konstrukcije na desnoj strani = znaka.
Ako dizajner/kompajler ne moze da pripise type, novi type bice pripisan prilikom kompilacije. Ova se osobina .NET jezika zove Anonimous type. Ista osobina jezika je koristena i prilikom deklaracije p in dc.Proizvods, gdje je p variabli pripisan type na osnovu dc.Proizvods kolekcije.
In i Where su pridodati LINQ- kao Extension methods (Vidi prvi post u seriji).
C# je isto tako karakteristican zbog upotrebe lambda expressions:
var prod = dc.Proizvods.Single(p => p.ProizvodIme == "Pereca");
p=>p.ProizvodIme == "Pereci" je lambda expression i znaci u ovom slucaju "Nadji mi proizvod p gdje p.ProizvodIme je jednak Pereci". Za sada je vazno da upamtite ovu konstrukciju a lamda expressions cemo da obradimo u posebnom postu. Ova sintaksa je karakteristicna za C# i ne moze se koristiti u VB.NET-u.
Pronadji proizvode u kategoriji
Vidjeli smo da LINQ to SQL OR mapper kreira asocijacije izmedju klasa(classes) na osnovu stranih kljuceva(foreign keys) u tabeli. To isto tako znaci da ce klasa koja ima strani kljuc (foreign key) u drugoj klasi imati kolekciju objekata iz te klase, a ta klasa ce imati "property" tipa prve klase. Tako na primjer mozemo na slijedeci nacin da dobijemo sve proizvode u odredjenoj kategoriji:
C#:
//Proizvodi u kategoriji
var pCat = from p in dc.Proizvods where p.Kategorija.KategorijaIme == "Peciva" select p;
VB:
'Proizvodi u kategoriji
Dim pKat = From p In dc.Proizvods Where p.Kategorija.KategorijaIme = "Peciva"
Pronadji jedan proizvod i promijeni cijenu
C#:
//Promijeni cijenu proizvodu
var prod1 = dc.Proizvods.Single(p => p.ProizvodIme == "Koka Kola");
prod1.ProizvodCijena = 5;
dc.SubmitChanges();
VB:
'Promijeni cijenu proizvodu
Dim prod1 = (From p In dc.Proizvods Where p.ProizvodIme = "Koka Kola").Single
prod1.ProizvodCijena = 5
dc.SubmitChanges()
Dodaj novi proizvod u kategoriji
C#:
//Dodaj novi proizvod u kategoriju
Proizvod proiz = new Proizvod();
proiz.ProizvodCijena = 5;
proiz.ProizvodIme = "Pita";
proiz.ProizvodOpis = "Pita sa mesom takodjer poznata kao burek";
Kategorija kat =dc.Kategorijas.Single(k => k.KategorijaIme=="Peciva" ) ;
kat.Proizvods.Add(proiz);
dc.SubmitChanges();
VB:
'Dodaj novi proizvod u kategoriju
Dim proiz As Proizvod = New Proizvod
proiz.ProizvodCijena = 5
proiz.ProizvodIme = "Pita"
proiz.ProizvodOpis = "Pita sa mesom takodjer zvana burek"
Dim kat = (From k In dc.Kategorijas Where k.KategorijaIme = "Peciva").Single
kat.Proizvods.Add(proiz)
dc.SubmitChanges()
Obrisi proizvod iz baze podataka
C#:
//obrisi proizvod iz baze podataka
Proizvod p2 = dc.Proizvods.Single(p => p.ProizvodIme == "Pita");
dc.Proizvods.DeleteOnSubmit(p2);
dc.SubmitChanges();
VB:
'Obrisi proizvod iz baze podataka
Dim p2 = (From p In dc.Proizvods Where p.ProizvodIme = "Pita").Single
dc.Proizvods.DeleteOnSubmit(p2)
dc.SubmitChanges()
U ovoj seriji smo obradili osnove LINQ-a i u buducim postovima obradicemo teme vezane za LINQ u vise detalja.
Mozete snimiti soluciju sa primjerima koristenim u ovoj seriji ako kliknete na jedan od linkova :
Projekti bez baze podataka (manja velicina fajla):
C#:
LINQTest.zip (52.64 kb)
VB.NET:
LINQTestVB.zip (85.47 kb)
Poslije otvaranja projekta dodajte bazu podataka MaliDucan.mdf kao sto je opisano u prvom dijelu serijala i u Query Anlyzer-u dodajte sledecu sql skriptu bazi podataka (dodaje tabele i podatke u tabelama):
MaliDucan.sql (9.35 kb)