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)