LINK UPITI I LAMBDA IZRAZI U C#
LINQ (Language Integrated Query) je moćan alat u .NET frameworku koji omogućava upit i manipulaciju podacima iz različitih izvora koristeći isti jezik upita, direktno unutar C# (ili drugih .NET jezika). LINQ pojednostavljuje rad sa podacima, bilo da su oni u memoriji, u bazi podataka, u XML dokumentima ili negde drugde.
Ključne karakteristike LINQ-a:
- Jedinstven Jezik Upita: LINQ omogućava upite na različite vrste izvora podataka (kolekcije u memoriji, baze podataka, XML, itd.) koristeći jedan sintaktički stil, čime se pojednostavljuje rad sa podacima.
- Integracija sa Jezicima: LINQ je integrisan u programski jezik, što znači da upiti i manipulacije podacima mogu biti napisani direktno u C# ili VB.NET kodu, a ne kao posebni SQL upiti ili drugi specifični jezici.
- Objektno-Orijentisana: LINQ omogućava upite nad objektima i kolekcijama u memoriji pomoću metoda i svojstava klasa, čime se izbegava potreba za pisanjem niskonivojskih petlji za pretragu i filtriranje.
- Staticka Provera Tipova: LINQ koristi statičku proveru tipova, što pomaže u otkrivanju grešaka pri kompilaciji, a ne tokom izvođenja.
Osnovne Komponente LINQ-a:
- LINQ to Objects: Upiti nad kolekcijama objekata u memoriji, kao što su liste ili nizovi. Ovo omogućava filterisanje, sortiranje i grupisanje podataka direktno u kodu.
- LINQ to SQL: Omogućava upite nad SQL bazama podataka koristeći SQL sintaksu integrisanu u C# kod.
- LINQ to Entities: Koristi Entity Framework za upite nad podacima u bazi podataka, omogućavajući rad sa relacijama i podacima kroz objekte.
- LINQ to XML: Omogućava rad sa XML podacima koristeći LINQ upite za filtriranje i manipulaciju XML dokumenata.
Primeri LINQ Upita:
1. LINQ to Objects (U memoriji)
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
{
public static void Main()
{
}{
// Lista putnika
List putnici = new List
{
// LINQ upit za filtriranje i sortiranje
var onlinePutnici = putnici
// Ispis rezultata
foreach (var p in onlinePutnici)
{
}List
{
new Putnik("Ana", "Petrović", "online"),
new Putnik("Marko", "Jovanović", "šalter"),
new Putnik("Ivana", "Nikolić", "online"),
new Putnik("Petar", "Savić", "online")
};new Putnik("Marko", "Jovanović", "šalter"),
new Putnik("Ivana", "Nikolić", "online"),
new Putnik("Petar", "Savić", "online")
// LINQ upit za filtriranje i sortiranje
var onlinePutnici = putnici
.Where(p => p.NacinKupovine == "online" && p.Rezervacija)
.OrderByDescending(p => p.Ime);
.OrderByDescending(p => p.Ime);
// Ispis rezultata
foreach (var p in onlinePutnici)
{
Console.WriteLine(p.ToString());
}Opis:
Ovaj kod prikazuje jednostavan primer korišćenja LINQ (Language Integrated Query) u C#. Cilj koda je filtriranje i sortiranje liste putnika na osnovu određenih kriterijuma.
Prvo je kreirana klasa koja opisuje neki objekat koji predstavlja putnika u vozu.
Ovaj kod prikazuje jednostavan primer korišćenja LINQ (Language Integrated Query) u C#. Cilj koda je filtriranje i sortiranje liste putnika na osnovu određenih kriterijuma.
Prvo je kreirana klasa koja opisuje neki objekat koji predstavlja putnika u vozu.
public class Putnik
{
{
public string Ime { get; set; }
public string Prezime { get; set; }
public string NacinKupovine { get; set; }
public bool Rezervacija { get; set; }
public Putnik(string ime, string prezime, string nacinKupovine)
{
public override string ToString()
{
}public string Prezime { get; set; }
public string NacinKupovine { get; set; }
public bool Rezervacija { get; set; }
public Putnik(string ime, string prezime, string nacinKupovine)
{
Ime = ime;
Prezime = prezime;
NacinKupovine = nacinKupovine;
Rezervacija = true; // Pretpostavimo da su svi putnici izvršili rezervaciju
}Prezime = prezime;
NacinKupovine = nacinKupovine;
Rezervacija = true; // Pretpostavimo da su svi putnici izvršili rezervaciju
public override string ToString()
{
return $"{Ime} {Prezime}, {NacinKupovine}";
}Ova klasa Putnik ima četiri svojstva:
- Ime (string): Ime putnika.
- Prezime (string): Prezime putnika.
- NacinKupovine (string): Način na koji je putnik kupio kartu (npr. "online" ili "šalter").
- Rezervacija (bool): Informacija da li je putnik izvršio rezervaciju (pretpostavka u ovom primeru je da svi imaju rezervaciju).
Zatim se u nastavku, vrši definisanje i popunjavanje liste putnici.
Ova lista "putnici" sadrži četiri objekta tipa Putnik, svaki sa različitim imenom, prezimenom i načinom kupovine.
Ova lista "putnici" sadrži četiri objekta tipa Putnik, svaki sa različitim imenom, prezimenom i načinom kupovine.
LINQ upit za filtriranje i sortiranje:
- Where: Ova metoda filtrira listu putnika i vraća samo one koji su kupili kartu "online" i koji su izvršili rezervaciju (Rezervacija == true).
- OrderByDescending: Ova metoda sortira rezultate po imenu putnika, u opadajućem redosledu (od Z ka A).
I na kraju tu je i forech petlja za prolaz kroz listu putnika u svakom ciklusu. Ovaj deo koda prolazi kroz sve putnike koji su filtrirani i sortirani, te ispisuje njihove podatke (ime, prezime i način kupovine).
Ovaj primer pokazuje kako možete koristiti LINQ da biste filtrirali i sortirali kolekciju objekata u C#. Konkretno, iz liste putnika se izdvajaju oni koji su kupili kartu online i sortiraju po imenu u opadajućem redosledu.
Ovaj primer pokazuje kako možete koristiti LINQ da biste filtrirali i sortirali kolekciju objekata u C#. Konkretno, iz liste putnika se izdvajaju oni koji su kupili kartu online i sortiraju po imenu u opadajućem redosledu.
LINQ to SQL (U bazi podataka)
using System;
using System.Linq;
using System.Data.Linq;
public class Program
{
public static void Main()
{
}
using System.Linq;
using System.Data.Linq;
public class Program
{
public static void Main()
{
using (var context = new MyDataContext())
{
}{
var putnici = from p in context.Putnici
foreach (var p in putnici)
{
}
where p.NacinKupovine == "online"
select p;
select p;
foreach (var p in putnici)
{
Console.WriteLine($"{p.Ime} {p.Prezime}");
}Objašnjenje primera
using System;
using System.Linq;
using System.Data.Linq;
using System;
using System.Linq;
using System.Data.Linq;
- using System;: Uvozi osnovne klase i tipove koji su potrebni za rad sa .NET framework-om, uključujući klase za rad sa konzolom, tipovima podataka itd.
- using System.Linq;: Uvozi LINQ (Language Integrated Query) biblioteke koje omogućavaju upotrebu upita unutar C# koda za rad sa kolekcijama podataka.
- using System.Data.Linq;: Uvozi LINQ to SQL biblioteke koje omogućavaju mapiranje relacionih baza podataka na .NET objekte, olakšavajući rad sa podacima iz baza koristeći objektno orijentisani pristup.
Definisanje klase Program i glavne metode Main
public class Program
{
{
public static void Main()
{
}{
// Kod unutar metode
}- public class Program: Definiše javnu klasu nazvanu Program koja sadrži glavnu metodu programa.
- public static void Main(): Glavna ulazna tačka programa. Kada se program pokrene, izvršavanje počinje od ove metode.
Kreiranje i korišćenje DataContext-a
using (var context = new MyDataContext())
{
{
// Operacije nad bazom podataka
}- using: Blok using osigurava da se resursi pravilno oslobode nakon što se završi rad sa njima. U ovom slučaju, obezbeđuje da se veza sa bazom podataka zatvori nakon izvršavanja operacija.
- var context = new MyDataContext():
- MyDataContext: Ovo je klasa koja predstavlja kontekst baze podataka. Obično se generiše pomoću alata kao što je LINQ to SQL Designer ili se ručno definiše. Ona sadrži mape tabela iz baze podataka na C# klase.
- Kreiranjem instance MyDataContext klase, uspostavlja se veza sa bazom podataka i omogućava interakcija sa njenim tabelama.
Definisanje LINQ upita
var putnici = from p in context.Putnici
where p.NacinKupovine == "online"
select p;
where p.NacinKupovine == "online"
select p;
Ovaj segment koda definiše LINQ upit koji:
- from p in context.Putnici:
- Pristupa tabeli Putnici u bazi podataka kroz kontekst context.
- Svaki zapis iz tabele Putnici je predstavljen promenljivom p.
- where p.NacinKupovine == "online":
- Filtrira zapise tako da zadrži samo one gde je vrednost kolone NacinKupovine jednaka "online".
- select p;:
- Selektuje filtrirane zapise i formira kolekciju rezultata koja se čuva u promenljivoj putnici.
Izvršavanje upita i ispis rezultata
foreach (var p in putnici)
{
{
Console.WriteLine($"{p.Ime} {p.Prezime}");
}- foreach (var p in putnici):
- Iterira kroz svaki rezultat dobijen iz prethodnog LINQ upita.
- U ovom trenutku se upit zapravo izvršava protiv baze podataka, i rezultati se vraćaju aplikaciji.
- Console.WriteLine($"{p.Ime} {p.Prezime}");:
- Ispisuje ime i prezime svakog putnika koji je kupio kartu online.
- Koristi se interpolacija stringa za formatiranje izlaza.
Celokupan kod sa dodatnim objašnjenjima
using System;
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;
// Definisanje entiteta Putnik
[Table(Name = "Putnici")]
public class Putnik
{
// Definisanje DataContext-a
public class MyDataContext : DataContext
{
public class Program
{
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;
// Definisanje entiteta Putnik
[Table(Name = "Putnici")]
public class Putnik
{
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int Id { get; set; }
[Column]
public string Ime { get; set; }
[Column]
public string Prezime { get; set; }
[Column]
public string NacinKupovine { get; set; }
}public int Id { get; set; }
[Column]
public string Ime { get; set; }
[Column]
public string Prezime { get; set; }
[Column]
public string NacinKupovine { get; set; }
// Definisanje DataContext-a
public class MyDataContext : DataContext
{
public Table Putnici;
public MyDataContext() : base("YourConnectionStringHere")
{
}
}public MyDataContext() : base("YourConnectionStringHere")
{
public class Program
{
public static void Main()
{
}{
using (var context = new MyDataContext())
{
}{
var putnici = from p in context.Putnici
where p.NacinKupovine == "online"
select p;
foreach (var p in putnici)
{
}where p.NacinKupovine == "online"
select p;
foreach (var p in putnici)
{
Console.WriteLine($"{p.Ime} {p.Prezime}");
}- Klasa Putnik:
- Obeležena atributima [Table] i [Column] koji mapiraju klasu i njena svojstva na odgovarajuću tabelu i kolone u bazi podataka.
- Klasa MyDataContext:
- Nasleđuje od DataContext klase i sadrži Table<Putnik> koja omogućava upite nad tabelom Putnici.
- Konstrukturu se prosleđuje konekcioni string koji definiše vezu sa bazom podataka.
Ovaj primer demonstrira kako koristiti LINQ to SQL za jednostavno i efikasno pristupanje i manipulisanje podacima iz relacione baze podataka koristeći C# i objektno orijentisani pristup. LINQ to SQL omogućava da pišete upite na intuitivan način, koristeći sintaksu C# jezika, bez potrebe za pisanjem sirovih SQL upita.
Prednosti korišćenja LINQ to SQL:
Prednosti korišćenja LINQ to SQL:
- Tipizovani upiti: Greške se otkrivaju tokom kompajliranja.
- Lakše održavanje koda: Upiti su čitljiviji i lakši za razumevanje.
- Integracija sa C# jezikom: Korišćenje poznate sintakse i koncepata jezika.
- Bezbednost: Smanjena mogućnost SQL injekcija jer se upiti generišu automatski.
Komponente LINQ Upita:
- Izvor Podataka: Kolekcija objekata, tabela u bazi podataka ili XML dokument.
- Upitni Operator: Funkcija kao što je Where, Select, OrderBy, GroupBy, itd., koji definišu šta želite da uradite sa podacima.
- Izvršenje: Upit se izvršava kada se podaci zaista zatraže, što omogućava odloženo izvršenje i optimizaciju.
Zaključak
LINQ olakšava rad sa podacima, čini kod čitljivijim i omogućava rad sa različitim vrstama podataka koristeći istu sintaksu. Omogućava elegantan način za filtriranje, sortiranje i manipulaciju podacima u .NET aplikacijama.
Lambda izrazi
Lambda izrazi su ključni deo modernih jezika programiranja kao što je C# i omogućavaju da sevpišu inline, anonimne funkcije. U suštini, lambda izrazi omogućavaju definisanje metoda bez potrebe za kreiranjem zasebnih metoda ili klasa.
Ključne Karakteristike Lambda Izraza:
- Anonimni Metodi: Lambda izrazi su anonimni, što znači da nemaju ime kao klasični metodi. Umesto toga, oni se koriste u kontekstu gde se može koristiti delegat ili funkcija kao što su Func<T>, Action<T>, ili Predicate<T>.
- Kratka Sintaksa: Lambda izrazi omogućavaju kraću i čitljiviju sintaksu za pisanje malih funkcija, posebno kada se koriste u LINQ upitima ili u funkcionalnim stilovima programiranja.
- Koncept Zatvaranja: Lambda izrazi mogu "zatočiti" ili "uhvatiti" promenljive iz spoljnog okruženja, što omogućava pristup lokalnim varijablama iz funkcije koja se izvršava kasnije.
Sintaksa Lambda Izraza:
Lambda izrazi koriste => operator, koji se naziva "lambda operator". Sintaksa je sledeća:
(parameters) => expression
Ili za složenije izraze:
(parameters) => { statement1; statement2; }
Primeri Lambda Izraza:
1. Jednostavan Lambda Izraz:
// Definiše lambda izraz koji dodaje 10 na dati broj
Func addTen = x => x + 10;
int result = addTen(5); // result = 15
Func
int result = addTen(5); // result = 15
2. Lambda Izraz u LINQ Upitu:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
}{
List numbers = new List { 1, 2, 3, 4, 5 };
// Koristi lambda izraz za filtriranje brojeva koji su veći od 3
var filteredNumbers = numbers.Where(n => n > 3);
foreach (var number in filteredNumbers)
{
}// Koristi lambda izraz za filtriranje brojeva koji su veći od 3
var filteredNumbers = numbers.Where(n => n > 3);
foreach (var number in filteredNumbers)
{
Console.WriteLine(number); // Ispisuje 4 i 5
}Ovaj kod demonstrira kako koristiti lambda izraz u kombinaciji sa metodom Where iz LINQ-a kako bi se filtrirali elementi liste koji zadovoljavaju određeni uslov. Konkretno, u ovom primeru, filtriraju se brojevi koji su veći od 3.
Ovde se dalje
Ovde se dalje
- Definiše generička lista celih brojeva (int).
- new List<int> { 1, 2, 3, 4, 5 };: Inicijalizuje listu sa brojevima 1, 2, 3, 4 i 5.
U nastavku je dat lambda izraz
var filteredNumbers = numbers.Where(n => n > 3);
numbers.Where(n => n > 3):
- Where: Ovo je LINQ metoda koja se koristi za filtriranje elemenata kolekcije na osnovu određenog uslova.
- n => n > 3: Ovo je lambda izraz koji predstavlja uslov za filtriranje.
- n: Predstavlja svaki pojedinačni element iz liste numbers.
- n > 3: Uslov koji filtrira brojeve; vraća true samo za one brojeve koji su veći od 3.
- Metoda Where vraća kolekciju koja sadrži sve elemente iz originalne liste koji zadovoljavaju ovaj uslov. U ovom slučaju, to su brojevi 4 i 5.
- var filteredNumbers:
- Promenljiva filteredNumbers čuva rezultat ovog filtriranja, koji je lista brojeva većih od 3.
3. Lambda Izraz sa Višestrukim Parametrima:
// Lambda izraz za sabiranje dva broja
Func add = (a, b) => a + b;
int sum = add(3, 4); // sum = 7
Func
int sum = add(3, 4); // sum = 7
- Func<int, int, int>: Func je generički delegat u C# koji može prihvatiti do 16 parametara i vraća vrednost. U ovom slučaju, Func<int, int, int> definiše delegat koji prima dva int parametra i vraća int vrednost.
- Lambda izraz: (a, b) => a + b je lambda izraz koji predstavlja anonimnu funkciju. Ona prima dva argumenta (a i b) i vraća rezultat njihovog sabiranja (a + b).
- add: Lambda izraz je dodeljen promenljivoj add, koja je tipa Func<int, int, int>. Ovo znači da add može biti korišćena kao funkcija koja prihvata dva int argumenta i vraća njihov zbir.
- Poziv funkcije: int sum = add(3, 4); poziva funkciju add sa argumentima 3 i 4. Rezultat sabiranja (koji je 7) se čuva u promenljivoj sum.
Upotreba Lambda Izraza:
- Filtriranje Podataka: Lambda izrazi se često koriste za filtriranje podataka u LINQ upitima, kao što je prikazano u prethodnim primerima.
- Sortiranje Podataka: Lambda izrazi mogu se koristiti za sortiranje kolekcija podataka, kao što je sortiranje liste po određenom kriterijumu.
- Definisanje Delegata: Lambda izrazi mogu se koristiti za direktno dodeljivanje metoda delegatima, što omogućava jednostavnu funkcionalnost u kodu.
Zaključak
Lambda izrazi su moćan alat u C# koji omogućava pisanje kompaktnih i čitljivih funkcija. Oni su posebno korisni za rad sa kolekcijama i funkcionalnim stilom programiranja, kao i za izrađivanje inline metoda bez potrebe za kreiranjem zasebnih metoda.
Prethodno
|< Kreiranje jednostavne aplikacije u C# |
Sledeće
Konekcija sa bazom u C#-primer >| |