C_3_0_i_NET_3_5_Technologia_LINQ_cshtec.pdf

(735 KB) Pobierz
C# 3.0 i .NET 3.5. Technologia LINQ
C# 3.0 i .NET 3.5.
Autor: Jacek Matulewski
ISBN: 83-246-1447-8
Format: 158x235, stron: 88
Wydawnictwo Helion
ul. Koľciuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Poznaj technologiķ LINQ
aby uzyskaě swobodny dostķp do danych z SQL Server, pliku XML lub kolekcji
z poziomu swoich programw
¤ Bezpieczny dostķp do danych przy zachowaniu kontroli typw
¤ Tworzenie zapytaĺ LINQ
¤ Budowanie, analiza i pobieranie danych z plikw XML
Zastosowanie technologii LINQ (ang. Language-Integrated Query, zintegrowany jķzyk
zapytaĺ) w zasadniczy sposb upraszcza projektowanie aplikacji bazodanowych.
Zapytanie LINQ zwraca kolekcjķ z przestrzeni nazw typw oglnych. Kolekcja ta moŃe
byě modyfikowana, a nastķpnie zwrcona do łrdĀa. Dziķki temu zachowywana jest
peĀna kontrola typw danych i ich konwersji w poszczeglnych mechanizmach
poľredniczĴcych w pobieraniu danych.
KsiĴŃka âC# 3.0 i .NET 3.5. Technologia LINQÒ prezentuje prosty sposb korzystania
ze zintegrowanego jķzyka zapytaĺ. Dziķki temu podrķcznikowi nauczysz siķ pobieraě
dane z rŃnego rodzaju łrdeĀ; tworzyě pliki XML w nowy, bardziej intuicyjny sposb;
stosowaě skĀadowane rozszerzenia ? nowego typu metody (oraz odpowiadajĴce
im operatory), zdefiniowane w najnowszej wersji jķzyka C#. Ponadto dowiesz siķ,
jak tworzyě wĀasne łrdĀa danych LINQ. Krtko mwiĴc, z ksiĴŃkĴ âC# 3.0 i .NET 3.5.
Technologia LINQÒ nawet jako ľrednio zaawansowany programista poradzisz sobie
ze stworzeniem bardzo skomplikowanych aplikacji bazodanowych.
¤ WyraŃenia Lambda
¤ Nowe operatory LINQ
¤ Zapytania LINQ
¤ LINQ to DataSet
¤ Aktualizacja danych w bazie
¤ Korzystanie z rozszerzeĺ
¤ Kontrolka LinqDataSource
¤ Tworzenie i modyfikacja pliku XML
¤ Tworzenie łrdeĀ danych LINQ
Ta ksiĴŃka wskaŃe Ci prosty sposb tworzenia doskonaĀych
i nowoczesnych aplikacji bazodanowych
Technologia LINQ
430817822.002.png 430817822.003.png 430817822.004.png 430817822.005.png
Spis treci
Wstp .............................................................................................. 5
Rozdzia 1. Nowoci jzyka C# 3.0 ..................................................................... 7
Okrelanie typu zmiennej lokalnej przy inicjalizacji ........................................................ 7
Wyraenia Lambda ........................................................................................................... 8
Rozszerzenia ...................................................................................................................10
Nowa forma inicjalizacji obiektów i tablic ..................................................................... 12
Nowe operatory LINQ .................................................................................................... 13
Typy anonimowe ............................................................................................................ 14
Przykad — kolekcja jako ródo danych ....................................................................... 14
Rozdzia 2. LINQ i ADO.NET .............................................................................. 21
Konfiguracja kontrolki DataSet ...................................................................................... 22
LINQ to DataSet, czyli tam i z powrotem .......................................................................... 24
Korzyci z LINQ to DataSet ........................................................................................... 26
Rozdzia 3. LINQ i SQL Server ........................................................................... 29
Klasa encji ...................................................................................................................... 29
Pobieranie danych .......................................................................................................... 31
Aktualizacja danych w bazie .......................................................................................... 32
Wizualne projektowanie klasy encji ............................................................................... 35
Korzystanie z procedur skadowanych ........................................................................... 44
Kontrolka LinqDataSource (ASP.NET) ......................................................................... 47
Rozdzia 4. LINQ i XML .................................................................................... 51
Tworzenie pliku XML za pomoc klas XDocument i XElement ................................... 51
Pobieranie wartoci z elementów o znanej pozycji w drzewie ....................................... 54
Przenoszenie danych z kolekcji do pliku XML .............................................................. 55
Przenoszenie danych z bazy danych (komponentu DataSet) do pliku XML .................. 56
Zapytania LINQ .............................................................................................................. 57
Modyfikacja pliku XML ................................................................................................. 59
Rozdzia 5. Tworzenie róde danych LINQ ......................................................... 61
IEnumerable ................................................................................................................... 61
IEnumerable<T> ............................................................................................................ 63
Oddzielenie róda od jego interfejsu ............................................................................. 65
IQueryable i IOrderedQueryable .................................................................................... 68
4
C# 3.0 i .NET 3.5. Technologia LINQ
IQueryable<T> i IOrderedQueryable<T> ...................................................................... 69
Drzewo wyraenia .......................................................................................................... 71
Zadanie. LINQ to TXT ................................................................................................... 78
Dodatek A Wicej w sieci… ............................................................................ 83
Skorowidz ...................................................................................... 85
Rozdzia 3.
LINQ i SQL Server
Wspominaj c o technologii LINQ, mówi si# zazwyczaj o zanurzeniu j#zyka SQL w j#-
zyku C#. W przypadku LINQ to SQL zanurzenie to mo%na rozumie& niemal dos'ownie
— zapytanie LINQ jest w tym przypadku t'umaczone bezpo)rednio na zapytanie SQL
wysy'ane do bazy danych.
Zacznijmy od prostej sytuacji: po' czmy si# z baz danych Telefony.mdf (zob. rysunek 2.3
z poprzedniego rozdzia'u) i pobierzmy z niej list# osób pe'noletnich. Wykorzystamy do
tego obiekt klasy DataContext , która jak na razie wspó'pracuje tylko z bazami SQL Server
(nie dotyczy to jednak lokalnych baz SQL Server Compact Edition). Klasa DataContext
jest g'ówn bram do technologii LINQ to SQL . Brama ta wymaga jednak stra%nika. Jego
rol# przejmuje klasa encji, tj. klasa C#, która zdefiniuje typ ka%dego rekordu (encji) tabeli
bazy danych. Dzi#ki tej klasie mo%liwe jest zbudowanie pomostu mi#dzy tabel pobie-
ran za pomoc zapytania SQL a kolekcj zwracan przez zapytanie LINQ, tj. mi#dzy
typem encji a typem elementu kolekcji. Dzi#ki tej klasie w zapytaniu LINQ mo%emy
u%ywa& nazw pól, które obecne s w tabeli, wr#cz identyfikowa& kolekcj# z tabel .
Zanim przejdziemy do konkretów, chcia'bym jeszcze zwróci& uwag# Czytelnika na je-
den istotny fakt. W LINQ to Object , które poznali)my w pierwszym rozdziale, 0ród'em
danych by'a kolekcja istniej ca w pami#ci i w pe'ni dost#pna z poziomu programu. Nie
by'o zatem konieczno)ci odwo'ywania do zasobów zewn#trznych (np. plików bazy danych).
Dzi#ki temu ca'y kod aplikacji móg' by& skompilowany do kodu po)redniego. W przy-
padku LINQ to SQL , którym zajmiemy si# w tym rozdziale, lub LINQ to XML , omówio-
nego w kolejnym rozdziale, taka pe'na kompilacja nie jest mo%liwa. Analiza danych
pobranych ze 0ród'a danych mo%e odby& si# dopiero w trakcie dzia'ania programu.
Realizowane jest to za pomoc drzewa zapyta1, które poznamy dok'adniej w ostatnim
rozdziale, przy okazji projektowania w'asnego 0ród'a danych LINQ.
Klasa encji
Klasa encji (ang. entity class ) to zwyk'a klasa C#, w której za pomoc atrybutów po-
wi zane s pola klasy z polami tabeli (kolumnami). Mamy wi#c do czynienia z mode-
lowaniem zawarto)ci relacyjnej bazy danych w typowanych klasach j#zyka, w którym
30
C# 3.0 i .NET 3.5. Technologia LINQ
przygotowujemy program. W tym kontek)cie u%ywany jest angielski termin strongly
typed , który podkre)la izomorficzno)& relacji klasy encji i struktury tabeli. Ów zwi -
zek jest niezwykle istotny — przede wszystkim umo%liwia kontrol# typów, która
w pewnym sensie rozci ga si# na po' czenie z baz danych. Dzi#ki tej relacji progra-
mista mo%e w pewnym stopniu uto%samia& t# klas# i reprezentowan przez ni tabel#.
To pozwala równie% przygotowywa& zapytania LINQ, korzystaj c z nazw pól tabeli
— jego t'umaczenie na zapytanie SQL jest dzi#ki temu szczególnie proste, a jedno-
cze)nie w pe'ni zachowana jest kontrola typów. Domy)lne wi zanie realizowane jest
na podstawie nazw obu pól. Mo%liwa jest jednak zmiana tego domy)lnego sposobu
wi zania oraz zmiana w'asno)ci poszczególnych pól.
Przed ca' klas znale0& si# powinien atrybut Table z przestrzeni nazw System.Data.
Linq.Mapping , w którym wskazujemy nazw# tabeli z bazy danych 1 . Natomiast przed
polami odpowiadaj cymi kolumnom w tabeli nale%y umie)ci& atrybut Column (z tej sa-
mej przestrzeni nazw), w którym mo%emy wskaza& m.in. nazw# kolumny w tabeli (pa-
rametr Name ), poinformowa& go, czy jest kluczem g'ównym ( IsPrimaryKey ) lub czy mo%e
przyjmowa& puste warto)ci ( CanBeNull ). Listing 3.1 zawiera przyk'ad klasy encji,
w której definiujemy typ rekordu z tabeli ListaOsob z bazy danych Telefony.mdf zna-
nej z poprzedniego rozdzia'u. 2
Listing 3.1. Klasa encji zwi1zana z tabel1 ListaOsob z bazy Telefony.mdf
[Table(Name = "ListaOsob")]
public class Osoba
{
[Column(Name = "Id", IsPrimaryKey = true)]
public int Id;
[Column(Name = "Imi2", CanBeNull = false)]
public string Imi.;
[Column(Name = "Nazwisko", CanBeNull = false)]
public string Nazwisko;
[Column]
public int NumerTelefonu;
[Column]
public int Wiek;
}
W powy%szym listingu wi zanie klasy ze struktur bazy danych przeprowadzane zo-
staje na podstawie atrybutów do' czanych do definicji klasy. W terminologii Microsoft
nazywane jest to mapowaniem opartym na atrybutach (ang. attribute-based mapping ).
1 Klasy z przestrzeni nazw System.Data.Linq i jej podprzestrzeni, m.in. z System.Data.Linq.Mapping ,
do której nale%y klasa Table , zdefiniowane s w osobnej bibliotece System.Data.Linq.dll , nale% cej
do zbioru bibliotek platformy .NET 3.5. Domy)lnie nie jest ona w' czana do zbioru bibliotek projektu.
Nale%y j zatem doda& samodzielnie, korzystaj c z polecenia Project , Add Reference… . Omówione
ni%ej narz#dzie wizualnego projektowania klas encji zwolni nas z tego obowi zku.
2 Tworz c tabel# w bazie SQL Server mogli)my zezwoli&, aby niektóre jej pola dopuszcza'y pust warto)&.
Definiuj c klas# encji warto zadeklarowa& odpowiadaj ce im pola klasy w taki sposób, aby dopuszcza'y
przypisanie warto)ci null . W przypadku 'a1cuchów nie ma problemu – typ String jest typem referencyjnym
i zawsze mo%na mu przypisa& warto)& null . Inaczej wygl da to np. w przypadku typu int , który jest typem
warto)ciowym. Nale%y wówczas w deklaracji pola wykorzysta& typ parametryczny Nullable<int> .
430817822.001.png
Zgłoś jeśli naruszono regulamin