Language INtegrated Query (LINQ)

Transkrypt

Language INtegrated Query (LINQ)
Language INtegrated Query (LINQ)
Języki Programowania na Platformie .NET (część 2)
Tomasz Goluch
http://www.kaims.pl/∼goluch/
[email protected]
Zastosowanie
LINQ pozwala na dostęp do danych w formie podobnej do SQL.
Możliwy jest dostęp do danych:
znajdujących się w kolekcjach i tablicach,
w bazie danych SQL,
w encjach (Entity Framework),
w obiektach DataSet (ADO.NET),
w formacie XML takich jak: dokumenty XML, Web serwisy,
WCF,
w zdarzeniach (Reactive Extensions)
udostępnianych przez innych dostawców niż Microsoft, np.:
Amazon, Google, MySQL, SPoint, AD, NHibernate, LDAP,
Excel, Snmp, ...
z generatorów liczb pierwszych, (pseudo)losowych, ciągów, ...
Tomasz Goluch
Language INtegrated Query (LINQ)
LINQ - podstawy
Operacja z użyciem LINQ przebiega następująco:
uzyskanie źródła/źródeł danych
zbudowanie zapytania
wykonanie zapytania
Tomasz Goluch
Language INtegrated Query (LINQ)
Przykład
Dim x() As Integer = {5,3,6,3,1,0,9,7,-2,11,43}
’ uwtorzenie zapytania:
Dim male = From liczba In x
Where liczba < 10
Select liczba
’ wykonanie zapytania:
For Each Dim n In male
Console.WriteLine(n)
Next
Tomasz Goluch
Language INtegrated Query (LINQ)
Zapytanie do tablicy
zastosowanie LINQ do tablicy jest możliwe, ponieważ tablice
implementują interfejs IEnumerable(Of T)
to samo odnosi się do wszystkich typów, które implementują
ten interfejs (np.
List(Of T), Dictionary(Of TKey, TValue)) lub
pochodny jak IQueryable(Of T)
w przypadku typów, które nie implementują takich interfejsów
potrzebny jest odpowiedni provider, który implementuje
niezbędną funkcjonalność dla standardowych operatorów w
zapytaniu, na przykład XElement jest typem pozwalającym na
dostęp do plików XML poprzez LINQ
Tomasz Goluch
Language INtegrated Query (LINQ)
Struktura zapytania - podstawy
zapytanie zaczyna sie od słowa kluczowego From. Odpowiada
ono za identyfikację typu źródła danych oraz zmiennych, które
są używane do odnoszenia się do poszczególnych danych (ang.
range variables lub iteration variables). W niektórych
zapytaniach słowo to jest opcjonalne. Przykład:
Dim zapytanie = From k In klienci
’
...
Tomasz Goluch
Language INtegrated Query (LINQ)
Struktura zapytania - podstawy
Where służy do filtrowania wyników (selekcja):
Dim zapytanie = From k In klienci
Where k.imie = "Ala"
’
...
Do łączenia zapytań Where można używać operatorów
logicznych And lub OR:
’
...
Where imie.miasto = "Gdansk"
And imie.imie = "Ala"
’
...
Where cust.miasto = "Wroclaw"
Or cust.imie = "Ola"
Tomasz Goluch
Language INtegrated Query (LINQ)
Struktura zapytania - podstawy
Select służy do zwracania tylko wybranych ’wierszy’
(projekcja):
Dim zapytanie = From k In klienci
Where k.imie = "Ala"
Select k.nazwisko, k.pesel
Tomasz Goluch
Language INtegrated Query (LINQ)
Wybór określonych pól – przykład
Dim wynik = From s In studenci
Where s.Miasto = "Gdansk"
Order By s.Nazwisko Ascending
Select Imie = s.Imie, Numer = s.NrInd
For Each stud In wynik
Console.WriteLine(stud.Imie & " " & stud.Numer)
Next
Tomasz Goluch
Language INtegrated Query (LINQ)
Złączenia
Złączenie można uzyskać używając odpowiednio operatora Where:
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
Where student.Last.IndexOf(vowel) = 0
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
For Each vName In vowelNames
Console.WriteLine(vName.Initial & ":
Next
A:
O:
O:
" & vName.Name)
Terry Adams
Svetlana Omelchenko
Michiko Osada
http://msdn.microsoft.com/en-us/library/bb384504.aspx
Tomasz Goluch
Language INtegrated Query (LINQ)
Złączenia
... lub korzystając z operatora Join (odpowiednik INNER JOIN
z SQL):
Dim vowelNames2 = From student In students
Join vowel In vowels
On student.Last(0) Equals vowel
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
A:
O:
O:
Terry Adams
Svetlana Omelchenko
Michiko Osada
http://msdn.microsoft.com/en-us/library/bb384504.aspx
Tomasz Goluch
Language INtegrated Query (LINQ)
Sortowanie
Złączenie uzyskujemy używając operatora Order By:
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
’
...
Operator Ascending jest opcjonalny (domyślny).
Tomasz Goluch
Language INtegrated Query (LINQ)
Sortowanie
... z pominięciem Where:
Dim slowa = {"ala", "ma", "kota", "i", "psa"}
Dim zapytanie = From w In slowa
Order By w.Length
Select w
i, ma, ala, psa, kota
i Select:
Dim x = From k In klienci Order By k.wiek
Tomasz Goluch
Language INtegrated Query (LINQ)
Sortowanie po kilku kryteriach
Przykład sortowania względem długości (rosnąco), oraz (dla
jednakowych długości) po pierwszej literze w słowie (malejąco)
Dim slowa = {"ala", "ma", "kota", "i", "psa"}
Dim zap = From w In slowa
Order By w.Length, w.Substring(0,1) Descending
Select w
i, ma, psa, ala, kota
Tomasz Goluch
Language INtegrated Query (LINQ)
Sortowanie po kilku kryteriach
Ten sam przykład sortowania ale błędny. Powoduje zaburzenie
pierwszego uporządkowania
Dim slowa = {"ala", "ma", "kota", "i", "psa"}
Dim zap = From w In slowa
Order By w.Length
Order By w.Substring(0,1) // utrata kolejności
Select w
ala, i, kota, ma, psa
Tomasz Goluch
Language INtegrated Query (LINQ)
Inne operatory
Let pozwala na przypisanie wartości, np.:
From p In produkty Let x = p.cena*0.1 Where x > 100
’ Dzieli zdanie na tablicę słów
’ i wybiera te które zaczynają się od samogłoski.
Dim earlyBirdQuery = from sentence in strings
let words = sentence.Split(’ ’)
from word in words
let w = word.ToLower()
where w[0] == ’a’ || w[0] == ’e’
|| w[0] == ’i’ || w[0] == ’o’
|| w[0] == ’u’
select word;
http://msdn.microsoft.com/en-us/library/vstudio/bb383976.aspx
Tomasz Goluch
Language INtegrated Query (LINQ)
Inne operatory
Dictinct eliminuje duplikaty:
From k In klienci Select k.Imie Distinct.
Tomasz Goluch
Language INtegrated Query (LINQ)
Operator grupowania
Group [ listField1 [, listField2 [...] ]
By keyExp1 [, keyExp2 [...] ]
Into aggregateList
Przykład:
Dim PracownikDzial1 = From p In Pracownicy
Dim PracownikDzial2 = From p In Pracownicy
Group By NazwaDzialu = p.Dzial
Into Dzial = Group, Count()
Order By NazwaDzialu
Tomasz Goluch
Language INtegrated Query (LINQ)
Przykład dostępu do bazy danych
’Create a standard ADO.NET connection:
Dim nwindConn As SqlConnection = _
New SqlConnection(My.Settings.NORTHWINDConnectionString1)
nwindConn.Open()
’... other ADO.NET database access code ... ’
’Use pre-existing ADO.NET connection to create DataContext:
Dim interop_db = New NorthwindDataContext(nwindConn)
With {.Log = db.Log}
Dim orders = From o In interop_db.Orders _
Where o.Freight > 500D _
Select o
ObjectDumper.Write(orders)
nwindConn.Close()
http://msdn.microsoft.com/en-us/vbasic/bb737919.aspx
Tomasz Goluch
Language INtegrated Query (LINQ)
Przykład dostępu do bazy danych
Tomasz Goluch
Language INtegrated Query (LINQ)
Przykład dostępu do kolekcji
Dim customers As List(Of Customer) = GetCustomerList()
Dim customersByCountry = From cust In customers _
Order By cust.Country, cust.City _
Group By CountryName = cust.Country _
Into RegionalCustomers = Group, Count()
Order By CountryName
For Each country In customersByCountry
Console.WriteLine(country.CountryName & _
" (" & country.Count & ")" & vbCrLf)
For Each customer In country.RegionalCustomers
Console.WriteLine(vbTab & customer.CompanyName & _
" (" & customer.City & ")")
Next
Next
http://msdn.microsoft.com/en-us/library/bb763068.aspx
Tomasz Goluch
Language INtegrated Query (LINQ)
Przykład dostępu do kolekcji
’ Output:
’
Canada count=2
’
Contoso, Ltd Halifax
’
Fabrikam, Inc. Vancouver
’
United States count=1
’
Margie’s Travel Redmond
http://msdn.microsoft.com/en-us/library/bb763068.aspx
Tomasz Goluch
Language INtegrated Query (LINQ)