Języki Programowania na Platformie.NET (część 2) http://www.kaims.pl/ goluch/ goluch@eti.pg.gda.pl
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,...
LINQ - podstawy Operacja z użyciem LINQ przebiega następująco: uzyskanie źródła/źródeł danych zbudowanie zapytania wykonanie zapytania
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
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
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...
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"
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
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
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 " & vname.name) A: Terry Adams O: Svetlana Omelchenko O: Michiko Osada http://msdn.microsoft.com/en-us/library/bb384504.aspx
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: Terry Adams O: Svetlana Omelchenko O: Michiko Osada http://msdn.microsoft.com/en-us/library/bb384504.aspx
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).
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
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
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
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
Inne operatory Dictinct eliminuje duplikaty: From k In klienci Select k.imie Distinct.
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
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
Przykład dostępu do bazy danych
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
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