POLITECHNIKA WROCŁAWSKA KOŁO NAUKOWE KREDEK Laboratorium nr 4 TEMAT ĆWICZENIA Zapoznanie z technologią LINQ Wykonał: Mateusz Woszczyk 155693 Termin: Cz / 19.00 Data wykonania ćwiczenia: 20.11.2011
1. LINQ co to jest? Technologia LINQ (Language Integrated Query zapytanie wbudowane w język) pozwala na tworzenie zapytań pobierających i aktualizujących dane z obiektów, baz danych, dokumentów XML, zbiorów danych ADO.Net i innych. 2. Jak zacząć(vs 2010 Pro, C# + LINQ to SQL) Aby zacząć prace przechodzimy do okna view-> Server Explorer Następnie klikam na przycisk Connect to Database.
Pojawia nam się okno Add Connection. W polu Data Sources wybieramy Microsoft SQL Server Database File, a następnie przyciskiem Browse wybieramy nasz plik z bazą danych. Gdy po przejściu kolejnych kroków i próbie wczytania bazy danych pojawi się błąd pokazany na rysunku poniżej. Należy w oknie Add connection przejść do zakładki Advanced.
A następnie w polu data source zmienić wartość z./sqlexpress na. Po wczytaniu naszej bazy danych, klikamy prawym przyciskiem myszy na nasz projekt i wybieramy Add -. New Item.
Pojawi nam się lista z której wybieramy LINQ to SQL Classes Następnie z okna Server Explorer przeciągamy do zakładki DataClasses1.dbml tabele na których chcemy pracować. W tym momencie możemy zacząć naszą pracę z technologią LINQ.
3. Podstawowe funkcje do obsługi baz danych Dodawanie nowych rekordów W tym celu należy skorzystać z funkcji InsertOnSubmit(). Employee cat = new Employee() FirstName = tbfirstname.text, LastName = tblastname.text, Title = tbtitle.text, Country = tbcountry.text, Notes = tbnotes.text, }; Musimy jednak pamiętać, że nasza metoda InsertOnSubmit() zapisuje dane tylko do naszego modelu obiektów, a nie zapisuje zmian w bazie danych. dc.employees.insertonsubmit(cat); W tym celu musimy wywołać jeszcze funkcję SubmitChanges(), która to dopiero zapisze zmiany w bazie danych. dc.submitchanges(); Aktualizowanie rekordów W Przypadku aktualizowania wierszy, najpierw odczytujemy dany wiersz a następnie go modyfikujemy. var query = (from p in dc.employees where p.employeeid == int.parse(tbid.text) orderby p.employeeid ascending select p).first(); Metoda First() zwraca pierwszy element z sekwencji, możemy tez zastosować metodę Single(), która zwróci nam jeden element z sekwencji albo zgłosi błąd, jeżeli w sekwencji będzie więcej elementów. Następnie zmieniamy wartości pól. query.firstname = tbfirstname.text; query.lastname = tblastname.text; query.title = tbtitle.text; query.country = tbcountry.text; query.notes = tbnotes.text; Zmiany w baize danych dokonujemy za pomocą metody SubmitChanges(). dc.submitchanges();
Usuwanie rekordów W celu usunięcia rekordu, najpierw należy go wyszukać, następnie wywołać metodę First() i na koniec użyć metody SubmitChanges(). var query = from p in dc.employees where p.employeeid == int.parse(tbid.text) orderby p.employeeid ascending select p; Przed wywołaniem metody DeleteOnSubmit() dla bezpieczeństwa możemy sprawdzić czy nasze zapytanie zwróciło w ogóle jakieś wyniki, jeżeli tak to możemy przystąpić do jego usunięcia. if (query.count() > 0) } dc.employees.deleteonsubmit(query.first()); dc.submitchanges(); 4. Inne przykłady Przykład 1 zapytanie zwracające wszystkie rekordy zaczynające się na dana literę. var query = from p in dc.categories where p.categoryname.contains("a") orderby p.categoryname ascending select p; Przykład 2 zapytanie zwracające wszystkie rekordy zaczynające się i kończące na dana literę. var query = from p in dc.categories where p.categoryname.startswith("c") && p.categoryname.endswith("s") orderby p.categoryname descending select p; Przykład 3 Proste zapytanie do znalezienia wyłącznie nieparzystych rekordów, z sortowaniem malejącym var query = from p in dc.categories where (p.categoryid % 2 == 1) orderby p.categoryname descending select p; Przykład 4 Użycie metody join do połączenia kolumn z dwóch różnych tabel i zapisanie wybranych w utworzonej klasie. var query = (from p in dc.customers.asenumerable() join r in dc.orders.asenumerable() on p.customerid equals r.customerid select new
id_nasz = p.customerid, CompanyName_nasz = p.companyname, ContactName_nasz = p.contactname, OrderDate_nasz = r.orderdate, ShipCountry_nasz = r.shipcountry }).ToList(); Przykład 5 Zapytanie wykonujące dokładnie to samo co w przykładzie 4, ale utworzone za pomocą składni metod zamiast składni zapytań. Znajdujący się tutaj znak => nosi nazwę operatora lambda i można go odczytywać jako przechodzi w. //Kod w postaci składni metod(=>) jest krótszy ale mniej intuicyjny var query = (dc.customers.asenumerable().join(dc.orders.asenumerable(), p => p.customerid, r => r.customerid, (p, r) => new id_nasz = p.customerid, CompanyName_nasz = p.companyname, ContactName_nasz = p.contactname, OrderDate_nasz = r.orderdate, ShipCountry_nasz = r.shipcountry })).ToList(); Przykład 6 Zapytanie które w prosty sposób realizuje wyświetlanie stanu dostępności danego produktu na podstawie ilości posiadanego produktu i liczby złożonych zamówień na dany produkt. var query = from p in dc.products select new ProductName = p.productname, Availability = p.unitsinstock - p.unitsonorder < 0? "Out Of Stock" : "In Stock" };