LINQ - Szybki przewodnik
Deweloperzy na całym świecie zawsze napotykali problemy z odpytywaniem danych z powodu braku zdefiniowanej ścieżki i konieczności opanowania wielu technologii, takich jak SQL, usługi sieciowe, XQuery itp.
Wprowadzony w Visual Studio 2008 i zaprojektowany przez Andersa Hejlsberga, LINQ (Language Integrated Query) umożliwia pisanie zapytań nawet bez znajomości języków zapytań, takich jak SQL, XML itp. Zapytania LINQ można pisać dla różnych typów danych.
Przykład zapytania LINQ
DO#
using System;
using System.Linq;
class Program {
static void Main() {
string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"};
//Get only short words
var shortWords = from word in words where word.Length <= 5 select word;
//Print each word out
foreach (var word in shortWords) {
Console.WriteLine(word);
}
Console.ReadLine();
}
}
VB
Module Module1
Sub Main()
Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"}
' Get only short words
Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word
' Print each word out.
For Each word In shortWords
Console.WriteLine(word)
Next
Console.ReadLine()
End Sub
End Module
Gdy powyższy kod C # lub VB jest kompilowany i wykonywany, daje następujący wynik -
hello
LINQ
world
Składnia LINQ
Istnieją dwie składnie LINQ. Oto poniższe.
Składnia Lamda (metoda)
var longWords = words.Where( w ⇒ w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)
Składnia zapytania (rozumienie)
var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10
Rodzaje LINQ
Rodzaje LINQ są wymienione poniżej w skrócie.
- LINQ to Objects
- LINQ to XML (XLINQ)
- LINQ to DataSet
- LINQ to SQL (DLINQ)
- LINQ to Entities
Oprócz powyższego istnieje również typ LINQ o nazwie PLINQ, który jest równoległym LINQ firmy Microsoft.
Architektura LINQ w .NET
LINQ ma architekturę 3-warstwową, w której najwyższa warstwa składa się z rozszerzeń języka, a dolna warstwa składa się ze źródeł danych, które są zwykle obiektami implementującymi interfejsy generyczne IEnumerable <T> lub IQueryable <T>. Architekturę przedstawiono poniżej.
Wyrażenia zapytania
Wyrażenie zapytania to nic innego jak zapytanie LINQ, wyrażone w formie podobnej do tej z SQL z operatorami zapytań, takimi jak Select, Where i OrderBy. Wyrażenia zapytania zwykle zaczynają się od słowa kluczowego „Od”.
Aby uzyskać dostęp do standardowych operatorów zapytań LINQ, należy domyślnie zaimportować przestrzeń nazw System.Query. Te wyrażenia są zapisywane w deklaratywnej składni zapytania, która była C # 3,0.
Poniżej znajduje się przykład pokazujący pełną operację zapytania, która składa się z utworzenia źródła danych, definicji wyrażenia zapytania i wykonania zapytania.
DO#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Operators {
class LINQQueryExpressions {
static void Main() {
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery = from score in scores where score > 80 select score;
// Execute the query.
foreach (int i in scoreQuery) {
Console.Write(i + " ");
}
Console.ReadLine();
}
}
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
97 92 81
Metody rozszerzeń
Wprowadzone w .NET 3.5 metody rozszerzające są zadeklarowane tylko w klasach statycznych i umożliwiają dołączanie niestandardowych metod do obiektów w celu wykonania pewnych precyzyjnych operacji zapytań w celu rozszerzenia klasy, nie będąc rzeczywistym członkiem tej klasy. Te również mogą być przeciążone.
W skrócie, metody rozszerzające służą do tłumaczenia wyrażeń zapytań na tradycyjne wywołania metod (zorientowane obiektowo).
Różnica między LINQ i procedurą składowaną
Istnieje szereg różnic między procedurami LINQ i składowanymi. Te różnice opisano poniżej.
Procedury składowane są znacznie szybsze niż zapytanie LINQ, ponieważ są zgodne z oczekiwanym planem wykonania.
Łatwo jest uniknąć błędów czasu wykonywania podczas wykonywania zapytania LINQ niż w porównaniu z procedurą składowaną, ponieważ ta pierwsza obsługuje technologię Visual Studio Intellisense, a także sprawdzanie pełnego typu podczas kompilacji.
LINQ umożliwia debugowanie przy użyciu debugera .NET, czego nie ma w przypadku procedur składowanych.
LINQ oferuje obsługę wielu baz danych w przeciwieństwie do procedur składowanych, w których konieczne jest ponowne napisanie kodu dla różnych typów baz danych.
Wdrożenie rozwiązania opartego na LINQ jest łatwe i proste w porównaniu z wdrożeniem zestawu procedur składowanych.
Potrzebujesz LINQ
Przed LINQ konieczne było nauczenie się C #, języka SQL i różnych interfejsów API, które łączą oba, tworząc kompletną aplikację. Ponieważ te źródła danych i języki programowania napotykają niedopasowanie impedancji; odczuwa się potrzebę krótkiego kodowania.
Poniżej znajduje się przykład tego, jak wiele różnych technik było używanych przez programistów podczas wykonywania zapytań dotyczących danych przed pojawieniem się LINQ.
SqlConnection sqlConnection = new SqlConnection(connectString);
SqlConnection.Open();
System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandText = "Select * from Customer";
return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)
Co ciekawe, spośród przedstawionych linii kodu zapytanie jest definiowane tylko przez dwie ostatnie. Korzystając z LINQ, to samo zapytanie o dane można zapisać w czytelnej formie oznaczonej kolorami, podobnie jak poniższa wspomniana poniżej, która również w bardzo krótszym czasie.
Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;
Zalety LINQ
LINQ oferuje wiele zalet, a wśród nich najważniejsza jest jego potężna ekspresja, która umożliwia programistom wyrażanie deklaratywne. Niektóre z innych zalet LINQ podano poniżej.
LINQ oferuje podświetlanie składni, które okazuje się pomocne w znajdowaniu błędów w czasie projektowania.
LINQ oferuje IntelliSense, co oznacza łatwe pisanie dokładniejszych zapytań.
Pisanie kodów w LINQ jest znacznie szybsze, a zatem czas programowania również ulega znacznemu skróceniu.
LINQ ułatwia debugowanie dzięki integracji w języku C #.
Przeglądanie relacji między dwiema tabelami jest łatwe dzięki LINQ ze względu na jego hierarchiczną funkcję, a to umożliwia komponowanie zapytań łączących wiele tabel w krótszym czasie.
LINQ umożliwia użycie pojedynczej składni LINQ podczas wykonywania zapytań w wielu różnych źródłach danych, a dzieje się tak głównie ze względu na jego jednoczącą podstawę.
LINQ jest rozszerzalny, co oznacza, że można używać wiedzy o LINQ do wykonywania zapytań o nowe typy źródeł danych.
LINQ oferuje możliwość łączenia kilku źródeł danych w jednym zapytaniu, a także dzielenia złożonych problemów na zestaw krótkich zapytań, które są łatwe do debugowania.
LINQ oferuje łatwą transformację do konwersji jednego typu danych na inny, na przykład przekształcanie danych SQL na dane XML.
Przed rozpoczęciem pracy z programami LINQ najlepiej jest najpierw zrozumieć niuanse związane z konfigurowaniem środowiska LINQ. LINQ potrzebuje frameworku .NET, rewolucyjnej platformy do obsługi różnorodnych aplikacji. Zapytanie LINQ można wygodnie napisać w języku C # lub Visual Basic.
Microsoft oferuje narzędzia dla obu tych języków, tj. C # i Visual Basic za pomocą Visual Studio. Wszystkie nasze przykłady zostały skompilowane i napisane w programie Visual Studio 2010. Jednak wersja Visual Basic 2013 jest również dostępna do użytku. Jest to najnowsza wersja i ma wiele podobieństw do programu Visual Studio 2012.
Pobieranie programu Visual Studio 2010 w systemie Windows 7
Program Visual Studio można zainstalować z nośnika instalacyjnego, takiego jak dysk DVD. Poświadczenia administratora są wymagane, aby pomyślnie zainstalować program Visual Basic 2010 w systemie. Ważne jest, aby odłączyć wszystkie wymienne USB od systemu przed instalacją, w przeciwnym razie instalacja może się nie powieść. Niektóre z wymagań sprzętowych niezbędnych do instalacji są następujące.
Wymagania sprzętowe
- 1,6 GHz lub więcej
- 1 GB pamięci RAM
- 3 GB (dostępne miejsce na dysku twardym)
- Dysk twardy 5400 obr./min
- Karta graficzna zgodna z DirectX 9
- Napęd DVD-ROM
Kroki instalacji
Step 1 - Najpierw po włożeniu dysku DVD z pakietem Visual Studio 2010 kliknij Install or run program from your media pojawiające się w wyskakującym okienku na ekranie.
Step 2- Teraz skonfigurowany dla programu Visual Studio pojawi się na ekranie. WybieraćInstall Microsoft Visual Studio 2010.
Step 3- Jak tylko klikniesz, proces zostanie zainicjowany i na ekranie pojawi się okno konfiguracji. Po zakończeniu ładowania komponentów instalacji, co zajmie trochę czasu, kliknijNext aby przejść do następnego kroku.
Step 4 - To jest ostatni etap instalacji. Pojawi się strona startowa, na której wystarczy wybrać opcję „Przeczytałem i akceptuję warunki licencji” i kliknąć Next przycisk.
Step 5- Teraz wybierz funkcje do zainstalowania ze strony opcji wyświetlanej na ekranie. Możesz wybraćFull lub Customopcja. Jeśli masz mniej miejsca na dysku, niż jest to wymagane pokazane w wymaganiach dotyczących miejsca na dysku, przejdź do opcji Niestandardowe.
Step 6- Po wybraniu opcji Niestandardowe pojawi się następujące okno. Wybierz funkcje, które chcesz zainstalować, i kliknijUpdate lub w innym przypadku przejdź do kroku 7. Jednak zaleca się rezygnację z opcji niestandardowej, ponieważ w przyszłości możesz potrzebować funkcji, których nie chcesz mieć.
Step 7- Wkrótce pojawi się wyskakujące okienko i rozpocznie się instalacja, która może zająć dużo czasu. Pamiętaj, że dotyczy to instalacji wszystkich komponentów.
Step 8- Na koniec będziesz mógł zobaczyć komunikat w oknie, że instalacja została zakończona pomyślnie. KliknijFinish.
Pisanie programu w języku C # przy użyciu LINQ w programie Visual Studio 2010
Uruchom wersję Visual Studio 2010 Ultimate i wybierz z menu Plik, a następnie Nowy projekt.
Na ekranie pojawi się nowe okno dialogowe projektu.
Teraz wybierz Visual C # jako kategorię pod zainstalowanymi szablonami, a następnie wybierz szablon aplikacji konsoli, jak pokazano na poniższym rysunku.
Nadaj projektowi nazwę w dolnym polu nazwy i naciśnij OK.
Nowy projekt pojawi się w Eksploratorze rozwiązań po prawej stronie nowego okna dialogowego na ekranie.
Teraz wybierz Program.cs z Eksploratora rozwiązań i możesz wyświetlić kod w oknie edytora, które zaczyna się od „using System”.
Tutaj możesz rozpocząć kodowanie następującego programu C #.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HelloWorld {
class Program {
static void Main(string[] args) {
Console.WriteLine("Hello World")
Console.ReadKey();
}
}
}
Naciśnij klawisz F5 i uruchom projekt. Zdecydowanie zaleca się zapisanie projektu, wybierającFile → Save All przed uruchomieniem projektu.
Pisanie programu VB przy użyciu LINQ w Visual Studio 2010
Uruchom wersję Visual Studio 2010 Ultimate i wybierz z menu Plik, a następnie Nowy projekt.
Na ekranie pojawi się nowe okno dialogowe projektu.
Teraz wybierz Visual Basic jako kategorię pod zainstalowanymi szablonami, a następnie wybierz szablon aplikacji konsoli.
Nadaj projektowi nazwę w dolnym polu nazwy i naciśnij OK.
Otrzymasz ekran z Module1.vb. Zacznij pisać swój kod VB tutaj, używając LINQ.
Module Module1
Sub Main()
Console.WriteLine("Hello World")
Console.ReadLine()
End Sub
End Module
Naciśnij klawisz F5 i uruchom projekt. Zdecydowanie zaleca się zapisanie projektu, wybierającFile → Save All przed uruchomieniem projektu.
Gdy powyższy kod C # lub VB jest kopiowany i uruchamiany, daje następujący wynik -
Hello World
Zestaw metod rozszerzających tworzących wzorzec zapytania jest znany jako standardowe operatory zapytań LINQ. Jako bloki konstrukcyjne wyrażeń zapytań LINQ, te operatory oferują szereg możliwości zapytań, takich jak filtrowanie, sortowanie, projekcja, agregacja itp.
Standardowe operatory zapytań LINQ można podzielić na następujące na podstawie ich funkcjonalności.
- Operatory filtrowania
- Dołącz do operatorów
- Operacje projekcyjne
- Sortowanie Operatory
- Operatory grupowania
- Conversions
- Concatenation
- Aggregation
- Operacje kwantyfikatora
- Operacje na partycjach
- Operacje generacji
- Operacje na zbiorach
- Equality
- Operatory elementów
Operatory filtrowania
Filtrowanie to operacja mająca na celu ograniczenie zbioru wyników tak, aby zawierał tylko wybrane elementy spełniające określony warunek.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
gdzie | Filtruj wartości na podstawie funkcji predykatu | gdzie | Gdzie |
OfType | Filtruj wartości na podstawie ich zdolności do bycia określonym typem | Nie dotyczy | Nie dotyczy |
Dołącz do operatorów
Łączenie odnosi się do operacji, w której celem są źródła danych, w których trudno jest bezpośrednio śledzić relacje między sobą.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
Przystąp | Operator łączy dwie sekwencje na podstawie pasujących kluczy | dołącz… w… dnia… równa się… | Od x W…, y W… Gdzie xa = ya |
GroupJoin | Połącz dwie sekwencje i zgrupuj pasujące elementy | dołącz… w… na… równa się… w… | Dołącz do grupy… w… w dniu… |
Operacje projekcyjne
Projekcja to operacja, w której obiekt zostaje przekształcony w zupełnie nową formę o określonych właściwościach.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
Wybierz | Operator rzutuje wartości na podstawie funkcji transformacji | Wybierz | Wybierz |
Wybierz wiele | Operator projektuje sekwencje wartości, które są oparte na funkcji transformacji, a także spłaszcza je w jedną sekwencję | Użyj wielu klauzul from | Użyj wielu klauzul From |
Sortowanie Operatory
Operacja sortowania umożliwia uporządkowanie elementów sekwencji na podstawie jednego lub większej liczby atrybutów.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
Zamów przez | Operator sortuje wartości w kolejności rosnącej | Zamów przez | Zamów przez |
OrderByDescending | Operator sortuje wartości w porządku malejącym | kolejność ... malejąco | Sortuj według ... Malejąco |
Następnie przez | Wykonuje dodatkowe sortowanie w kolejności rosnącej | Zamów przez …, … | Zamów przez …, … |
ThenByDescending | Wykonuje dodatkowe sortowanie w kolejności malejącej | w kolejności…,… malejąco | Uporządkuj według…,… Malejąco |
Odwrócić | Wykonuje odwrócenie kolejności elementów w kolekcji | Nie dotyczy | Nie dotyczy |
Operatory grupowania
Operatorzy umieszczają dane w niektórych grupach na podstawie wspólnego atrybutu wspólnego.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
Grupuj według | Organizuj sekwencję elementów w grupach i zwracaj je jako kolekcję IEnumerable typu IGrouping <key, element> | grupować… przez -lub- grupować… przez… do… | Grupuj… Przez… W… |
ToLookup | Wykonaj operację grupowania, w której zwracana jest sekwencja par kluczy | Nie dotyczy | Nie dotyczy |
Konwersje
Operatory zmieniają typ obiektów wejściowych i są wykorzystywane w różnorodnych zastosowaniach.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
AsEnumerable | Zwraca dane wejściowe wpisane jako IEnumerable <T> | Nie dotyczy | Nie dotyczy |
AsQueryable | (Generic) IEnumerable jest konwertowany na (ogólny) IQueryable | Nie dotyczy | Nie dotyczy |
Odlew | Wykonuje rzutowanie elementów kolekcji do określonego typu | Użyj jawnie wpisanej zmiennej zakresu. Np .: ze string str w słowach | Od… Jak… |
OfType | Filtruje wartości na podstawie ich, w zależności od ich możliwości rzutowania na określony typ | Nie dotyczy | Nie dotyczy |
ToArray | Wymusza wykonanie zapytania i wykonuje konwersję kolekcji na tablicę | Nie dotyczy | Nie dotyczy |
ToDictionary | Na podstawie funkcji selektora kluczy ustawia elementy w Dictionary <TKey, TValue> i wymusza wykonanie zapytania LINQ | Nie dotyczy | Nie dotyczy |
Notować | Wymusza wykonanie zapytania, konwertując kolekcję na List <T> | Nie dotyczy | Nie dotyczy |
ToLookup | Wymusza wykonanie zapytania i umieszcza elementy w Lookup <TKey, TElement> na podstawie funkcji selektora kluczy | Nie dotyczy | Nie dotyczy |
Powiązanie
Wykonuje konkatenację dwóch sekwencji i jest dość podobny do operatora Unii pod względem działania z wyjątkiem faktu, że nie usuwa to duplikatów.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
Concat | Dwie sekwencje są łączone w celu utworzenia jednej jednej sekwencji. | Nie dotyczy | Nie dotyczy |
Zbiór
Wykonuje dowolny typ żądanej agregacji i umożliwia tworzenie niestandardowych agregacji w LINQ.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
Agregat | Działa na wartościach kolekcji w celu wykonania niestandardowej operacji agregacji | Nie dotyczy | Nie dotyczy |
Średni | Obliczana jest średnia wartość zbioru wartości | Nie dotyczy | Aggregate… In… Into Average () |
Liczyć | Zlicza elementy spełniające funkcję predykatu w kolekcji | Nie dotyczy | Aggregate… In… Into Count () |
LonCount | Zlicza elementy spełniające funkcję predykatu w ogromnej kolekcji | Nie dotyczy | Agreguj… w… w LongCount () |
Maks | Sprawdź maksymalną wartość w kolekcji | Nie dotyczy | Agreguj… In… Into Max () |
Min | Sprawdź minimalną wartość istniejącą w kolekcji | Nie dotyczy | Aggregate… In… Into Min () |
Suma | Sprawdź sumę wartości w kolekcji | Nie dotyczy | Agreguj… w… w sumę () |
Operacje kwantyfikatora
Te operatory zwracają wartość logiczną, tj. True lub False, gdy niektóre lub wszystkie elementy w sekwencji spełniają określony warunek.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
Wszystko | Zwraca wartość „True”, jeśli wszystkie elementy sekwencji spełniają warunek predykatu | Nie dotyczy | Agreguj… w… we wszystko (…) |
Każdy | Określa, przeszukując sekwencję, która określa, czy dowolny element tego samego spełnia określony warunek | Nie dotyczy | Aggregate… In… Into Any () |
Zawiera | Zwraca wartość „True”, jeśli stwierdzi, że określony element występuje w sekwencji, jeśli sekwencja nie zawiera tego określonego elementu, zwracana jest wartość „false” | Nie dotyczy | Nie dotyczy |
Operatory partycji
Podziel sekwencję wejściową na dwie oddzielne sekcje bez zmiany układu elementów sekwencji, a następnie zwracania jednego z nich.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
Pominąć | Pomija określoną liczbę elementów w sekwencji i zwraca pozostałe | Nie dotyczy | Pominąć |
SkipWhile | Tak samo jak w przypadku Pomiń, z jedynym wyjątkiem, że liczba elementów do pominięcia jest określona przez warunek logiczny | Nie dotyczy | Pomiń podczas |
Brać | Weź określoną liczbę elementów z sekwencji i pomiń pozostałe | Nie dotyczy | Brać |
TakeWhile | To samo, co Take, z wyjątkiem faktu, że liczba elementów do wzięcia jest określona przez warunek logiczny | Nie dotyczy | Nie spiesz się |
Operacje generacji
Operatorzy pokoleń tworzą nową sekwencję wartości.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
DefaultIfEmpty | Po zastosowaniu do pustej sekwencji generuje domyślny element w sekwencji | Nie dotyczy | Nie dotyczy |
Pusty | Zwraca pustą sekwencję wartości i jest najprostszym operatorem generacyjnym | Nie dotyczy | Nie dotyczy |
Zasięg | Generuje kolekcję zawierającą sekwencję liczb całkowitych lub liczb | Nie dotyczy | Nie dotyczy |
Powtarzać | Generuje sekwencję zawierającą powtarzające się wartości o określonej długości | Nie dotyczy | Nie dotyczy |
Operacje na zbiorach
Istnieją cztery operatory dla operacji na zbiorach, z których każdy daje wynik oparty na innych kryteriach.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
Odrębny | Tworzy listę unikatowych wartości z kolekcji, filtrując zduplikowane dane, jeśli istnieją | Nie dotyczy | Odrębny |
Z wyjątkiem | Porównuje wartości dwóch kolekcji i zwraca te z jednej kolekcji, których nie ma w drugiej kolekcji | Nie dotyczy | Nie dotyczy |
Krzyżować | Zwraca zestaw wartości znalezionych jako identyczne w dwóch oddzielnych kolekcjach | Nie dotyczy | Nie dotyczy |
Unia | Łączy zawartość dwóch różnych kolekcji w jedną listę, która również nie zawiera powielonych treści | Nie dotyczy | Nie dotyczy |
Równość
Porównuje dwa zdania (wyliczalne) i określa, czy są one dokładnym dopasowaniem, czy nie.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
SequenceEqual | Daje wartość logiczną, jeśli okaże się, że dwie sekwencje są identyczne | Nie dotyczy | Nie dotyczy |
Operatory elementów
Z wyjątkiem DefaultIfEmpty, wszystkie pozostałe osiem standardowych operatorów elementów zapytania zwraca pojedynczy element z kolekcji.
Pokaż przykłady
Operator | Opis | Składnia wyrażenia zapytania w języku C # | Składnia wyrażenia zapytania VB |
---|---|---|---|
ElementAt | Zwraca element obecny w określonym indeksie w kolekcji | Nie dotyczy | Nie dotyczy |
ElementAtOrDefault | To samo co ElementAt, z wyjątkiem tego, że zwraca również wartość domyślną w przypadku, gdy określony indeks jest poza zakresem | Nie dotyczy | Nie dotyczy |
Pierwszy | Pobiera pierwszy element w kolekcji lub pierwszy element spełniający określony warunek | Nie dotyczy | Nie dotyczy |
FirstOrDefault | To samo co First, z wyjątkiem faktu, że zwraca również wartość domyślną w przypadku, gdy nie ma takich elementów | Nie dotyczy | Nie dotyczy |
Ostatni, ubiegły, zeszły | Pobiera ostatni element obecny w kolekcji lub ostatni element spełniający określony warunek | Nie dotyczy | Nie dotyczy |
LastOrDefault | Tak samo jak Last, z wyjątkiem faktu, że zwraca również wartość domyślną w przypadku, gdy nie ma takiego elementu | Nie dotyczy | Nie dotyczy |
Pojedynczy | Zwraca samotny element kolekcji lub samotny element, który spełnia określony warunek | Nie dotyczy | Nie dotyczy |
SingleOrDefault | To samo co Single, z tą różnicą, że zwraca również wartość domyślną, jeśli nie ma takiego samotnego elementu | Nie dotyczy | Nie dotyczy |
DefaultIfEmpty | Zwraca wartość domyślną, jeśli kolekcja lub lista jest pusta lub null | Nie dotyczy | Nie dotyczy |
LINQ to SQL oferuje infrastrukturę (czas wykonywania) do zarządzania danymi relacyjnymi jako obiektami. Jest składnikiem wersji 3.5 programu .NET Framework i sprawnie tłumaczy zintegrowane językowo zapytania modelu obiektowego na SQL. Zapytania te są następnie przesyłane do bazy danych w celu wykonania. Po uzyskaniu wyników z bazy danych LINQ to SQL ponownie tłumaczy je na obiekty.
Wprowadzenie LINQ To SQL
Dla większości programistów ASP.NET LINQ to SQL (znany również jako DLINQ) jest elektryzującą częścią zapytania zintegrowanego z językiem, ponieważ umożliwia odpytywanie danych w bazie danych serwera SQL przy użyciu zwykłych wyrażeń LINQ. Pozwala również na aktualizację, usuwanie i wstawianie danych, ale jedyną wadą, na którą cierpi, jest ograniczenie do bazy danych serwera SQL. Jednak LINQ to SQL przez ADO.NET ma wiele zalet, takich jak mniejsza złożoność, kilka wierszy kodu i wiele innych.
Poniżej znajduje się diagram przedstawiający architekturę wykonywania LINQ to SQL.
Jak używać LINQ to SQL?
Step 1- Utwórz nowe „połączenie danych” z serwerem bazy danych. Wyświetl & arrar; Eksplorator serwera & arrar; Połączenia danych & arrar; Dodaj połączenie
Step 2 - Dodaj plik klasy LINQ To SQL
Step 3 - Wybierz tabele z bazy danych i przeciągnij i upuść do nowego pliku klasy LINQ to SQL.
Step 4 - Dodano tabele do pliku klasy.
Wykonywanie zapytań za pomocą LINQ to SQL
Zasady wykonywania zapytania za pomocą LINQ to SQL są podobne do reguł w przypadku standardowego zapytania LINQ, tj. Zapytanie jest wykonywane odroczone lub natychmiastowe. Istnieją różne składniki, które odgrywają rolę w wykonywaniu zapytania za pomocą LINQ to SQL, a są to następujące.
LINQ to SQL API - żąda wykonania zapytania w imieniu aplikacji i wysyła je do LINQ to SQL Provider.
LINQ to SQL Provider - konwertuje zapytanie do Transact SQL (T-SQL) i wysyła nowe zapytanie do ADO Provider w celu wykonania.
ADO Provider - Po wykonaniu zapytania wyślij wyniki w postaci DataReadera do LINQ to SQL Provider, który z kolei przekształci je w postać obiektu użytkownika.
Należy zauważyć, że przed wykonaniem zapytania LINQ to SQL niezbędne jest połączenie się ze źródłem danych za pośrednictwem klasy DataContext.
Wstawianie, aktualizowanie i usuwanie za pomocą LINQ To SQL
Dodaj LUB Wstaw
C#
using System;
using System.Linq;
namespace LINQtoSQL {
class LinqToSQLCRUD {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);
//Create new Employee
Employee newEmployee = new Employee();
newEmployee.Name = "Michael";
newEmployee.Email = "[email protected]";
newEmployee.ContactNo = "343434343";
newEmployee.DepartmentId = 3;
newEmployee.Address = "Michael - USA";
//Add new Employee to database
db.Employees.InsertOnSubmit(newEmployee);
//Save changes to Database.
db.SubmitChanges();
//Get new Inserted Employee
Employee insertedEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("Michael"));
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, Address = {4}",
insertedEmployee.EmployeeId, insertedEmployee.Name, insertedEmployee.Email,
insertedEmployee.ContactNo, insertedEmployee.Address);
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Module Module1
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim db As New LinqToSQLDataContext(connectString)
Dim newEmployee As New Employee()
newEmployee.Name = "Michael"
newEmployee.Email = "[email protected]"
newEmployee.ContactNo = "343434343"
newEmployee.DepartmentId = 3
newEmployee.Address = "Michael - USA"
db.Employees.InsertOnSubmit(newEmployee)
db.SubmitChanges()
Dim insertedEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("Michael"))
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3},
Address = {4}", insertedEmployee.EmployeeId, insertedEmployee.Name,
insertedEmployee.Email, insertedEmployee.ContactNo, insertedEmployee.Address)
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Kiedy powyższy kod C # lub VB jest kompilowany i uruchamiany, daje następujący wynik -
Emplyee ID = 4, Name = Michael, Email = [email protected], ContactNo =
343434343, Address = Michael - USA
Press any key to continue.
Aktualizacja
C#
using System;
using System.Linq;
namespace LINQtoSQL {
class LinqToSQLCRUD {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);
//Get Employee for update
Employee employee = db.Employees.FirstOrDefault(e =>e.Name.Equals("Michael"));
employee.Name = "George Michael";
employee.Email = "[email protected]";
employee.ContactNo = "99999999";
employee.DepartmentId = 2;
employee.Address = "Michael George - UK";
//Save changes to Database.
db.SubmitChanges();
//Get Updated Employee
Employee updatedEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("George Michael"));
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, Address = {4}",
updatedEmployee.EmployeeId, updatedEmployee.Name, updatedEmployee.Email,
updatedEmployee.ContactNo, updatedEmployee.Address);
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Module Module1
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim db As New LinqToSQLDataContext(connectString)
Dim employee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("Michael"))
employee.Name = "George Michael"
employee.Email = "[email protected]"
employee.ContactNo = "99999999"
employee.DepartmentId = 2
employee.Address = "Michael George - UK"
db.SubmitChanges()
Dim updatedEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("George Michael"))
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3},
Address = {4}", updatedEmployee.EmployeeId, updatedEmployee.Name,
updatedEmployee.Email, updatedEmployee.ContactNo, updatedEmployee.Address)
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Gdy powyższy kod C # lub Vb jest kompilowany i uruchamiany, daje następujący wynik -
Emplyee ID = 4, Name = George Michael, Email = [email protected], ContactNo =
999999999, Address = Michael George - UK
Press any key to continue.
Usunąć
C#
using System;
using System.Linq;
namespace LINQtoSQL {
class LinqToSQLCRUD {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
LinqToSQLDataContext db = newLinqToSQLDataContext(connectString);
//Get Employee to Delete
Employee deleteEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("George Michael"));
//Delete Employee
db.Employees.DeleteOnSubmit(deleteEmployee);
//Save changes to Database.
db.SubmitChanges();
//Get All Employee from Database
var employeeList = db.Employees;
foreach (Employee employee in employeeList) {
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}",
employee.EmployeeId, employee.Name, employee.Email, employee.ContactNo);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Module Module1
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim db As New LinqToSQLDataContext(connectString)
Dim deleteEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("George Michael"))
db.Employees.DeleteOnSubmit(deleteEmployee)
db.SubmitChanges()
Dim employeeList = db.Employees
For Each employee As Employee In employeeList
Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}",
employee.EmployeeId, employee.Name, employee.Email, employee.ContactNo)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Kiedy powyższy kod C # lub VB jest kompilowany i uruchamiany, daje następujący wynik -
Emplyee ID = 1, Name = William, Email = [email protected], ContactNo = 999999999
Emplyee ID = 2, Name = Miley, Email = [email protected], ContactNo = 999999999
Emplyee ID = 3, Name = Benjamin, Email = [email protected], ContactNo =
Press any key to continue.
LINQ to Objects oferuje użycie dowolnego zapytania LINQ obsługującego IEnumerable <T> do uzyskiwania dostępu do kolekcji danych w pamięci bez konieczności korzystania z dostawcy LINQ (API), tak jak w przypadku LINQ to SQL lub LINQ to XML.
Wprowadzenie LINQ to Objects
Zapytania w LINQ to Objects zwracają zmienne typu zwykle tylko IEnumerable <T>. Krótko mówiąc, LINQ to Objects oferuje świeże podejście do kolekcji, ponieważ wcześniej konieczne było napisanie długiego kodowania (dla wszystkich pętli o dużej złożoności) do pobierania danych z kolekcji, która jest teraz zastępowana pisaniem kodu deklaratywnego, który jasno opisuje żądane dane który jest wymagany do odzyskania.
LINQ to Objects ma również wiele zalet w porównaniu z tradycyjnymi pętlami foreach, takimi jak większa czytelność, zaawansowane filtrowanie, możliwość grupowania, ulepszone porządkowanie przy minimalnym kodowaniu aplikacji. Takie zapytania LINQ mają również bardziej zwarty charakter i można je przenosić do innych źródeł danych bez żadnych modyfikacji lub z niewielką modyfikacją.
Poniżej znajduje się prosty przykład LINQ to Objects -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LINQtoObjects {
class Program {
static void Main(string[] args) {
string[] tools = { "Tablesaw", "Bandsaw", "Planer", "Jointer", "Drill", "Sander" };
var list = from t in tools select t;
StringBuilder sb = new StringBuilder();
foreach (string s in list) {
sb.Append(s + Environment.NewLine);
}
Console.WriteLine(sb.ToString(), "Tools");
Console.ReadLine();
}
}
}
W tym przykładzie tablica ciągów (narzędzi) jest używana jako kolekcja obiektów do odpytywania przy użyciu LINQ to Objects.
Objects query is:
var list = from t in tools select t;
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Tablesaw
Bandsaw
Planer
Jointer
Drill
Sander
Wykonywanie zapytań w kolekcjach pamięci przy użyciu LINQ to Objects
DO#
using System;
using System.Collections.Generic;
using System.Linq;
namespace LINQtoObjects {
class Department {
public int DepartmentId { get; set; }
public string Name { get; set; }
}
class LinqToObjects {
static void Main(string[] args) {
List<Department> departments = new List<Department>();
departments.Add(new Department { DepartmentId = 1, Name = "Account" });
departments.Add(new Department { DepartmentId = 2, Name = "Sales" });
departments.Add(new Department { DepartmentId = 3, Name = "Marketing" });
var departmentList = from d in departments
select d;
foreach (var dept in departmentList) {
Console.WriteLine("Department Id = {0} , Department Name = {1}",
dept.DepartmentId, dept.Name);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Collections.Generic
Imports System.Linq
Module Module1
Sub Main(ByVal args As String())
Dim account As New Department With {.Name = "Account", .DepartmentId = 1}
Dim sales As New Department With {.Name = "Sales", .DepartmentId = 2}
Dim marketing As New Department With {.Name = "Marketing", .DepartmentId = 3}
Dim departments As New System.Collections.Generic.List(Of Department)(New Department() {account, sales, marketing})
Dim departmentList = From d In departments
For Each dept In departmentList
Console.WriteLine("Department Id = {0} , Department Name = {1}", dept.DepartmentId, dept.Name)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
Class Department
Public Property Name As String
Public Property DepartmentId As Integer
End Class
End Module
Gdy powyższy kod C # lub VB jest kompilowany i wykonywany, daje następujący wynik -
Department Id = 1, Department Name = Account
Department Id = 2, Department Name = Sales
Department Id = 3, Department Name = Marketing
Press any key to continue.
Zestaw danych oferuje niezwykle użyteczną reprezentację danych w pamięci i jest używany w różnorodnych aplikacjach opartych na danych. LINQ to Dataset jako jedna z technologii LINQ to ADO.NET ułatwia wykonywanie zapytań dotyczących danych zestawu danych w bezproblemowy sposób i zwiększa produktywność.
Wprowadzenie LINQ To Dataset
LINQ to Dataset uprościło zadanie wykonywania zapytań przez deweloperów. Nie muszą pisać zapytań w określonym języku zapytań, zamiast tego to samo można napisać w języku programowania. LINQ to Dataset jest również użyteczny do wykonywania zapytań, w których dane są konsolidowane z wielu źródeł danych. To również nie wymaga żadnego dostawcy LINQ, takiego jak LINQ to SQL i LINQ to XML do uzyskiwania dostępu do danych z kolekcji pamięci.
Poniżej znajduje się prosty przykład zapytania LINQ to Dataset, w którym najpierw uzyskuje się źródło danych, a następnie zestaw danych jest wypełniany dwiema tabelami danych. Relacja jest ustanawiana między obydwoma tabelami, a zapytanie LINQ jest tworzone dla obu tabel za pomocą klauzuli join. Wreszcie pętla foreach służy do wyświetlania żądanych wyników.
DO#
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LINQtoDataset {
class Program {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
string sqlSelect = "SELECT * FROM Department;" + "SELECT * FROM Employee;";
// Create the data adapter to retrieve data from the database
SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);
// Create table mappings
da.TableMappings.Add("Table", "Department");
da.TableMappings.Add("Table1", "Employee");
// Create and fill the DataSet
DataSet ds = new DataSet();
da.Fill(ds);
DataRelation dr = ds.Relations.Add("FK_Employee_Department",
ds.Tables["Department"].Columns["DepartmentId"],
ds.Tables["Employee"].Columns["DepartmentId"]);
DataTable department = ds.Tables["Department"];
DataTable employee = ds.Tables["Employee"];
var query = from d in department.AsEnumerable()
join e in employee.AsEnumerable()
on d.Field<int>("DepartmentId") equals
e.Field<int>("DepartmentId")
select new {
EmployeeId = e.Field<int>("EmployeeId"),
Name = e.Field<string>("Name"),
DepartmentId = d.Field<int>("DepartmentId"),
DepartmentName = d.Field<string>("Name")
};
foreach (var q in query) {
Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}",
q.EmployeeId, q.Name, q.DepartmentName);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Data.SqlClient
Imports System.Linq
Module LinqToDataSet
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim sqlSelect As String = "SELECT * FROM Department;" + "SELECT * FROM Employee;"
Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
sqlCnn.Open()
Dim da As New SqlDataAdapter
da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)
da.TableMappings.Add("Table", "Department")
da.TableMappings.Add("Table1", "Employee")
Dim ds As New DataSet()
da.Fill(ds)
Dim dr As DataRelation = ds.Relations.Add("FK_Employee_Department", ds.Tables("Department").Columns("DepartmentId"), ds.Tables("Employee").Columns("DepartmentId"))
Dim department As DataTable = ds.Tables("Department")
Dim employee As DataTable = ds.Tables("Employee")
Dim query = From d In department.AsEnumerable()
Join e In employee.AsEnumerable() On d.Field(Of Integer)("DepartmentId") Equals
e.Field(Of Integer)("DepartmentId")
Select New Person With { _
.EmployeeId = e.Field(Of Integer)("EmployeeId"),
.EmployeeName = e.Field(Of String)("Name"),
.DepartmentId = d.Field(Of Integer)("DepartmentId"),
.DepartmentName = d.Field(Of String)("Name")
}
For Each e In query
Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}", e.EmployeeId, e.EmployeeName, e.DepartmentName)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
Class Person
Public Property EmployeeId As Integer
Public Property EmployeeName As String
Public Property DepartmentId As Integer
Public Property DepartmentName As String
End Class
End Module
Gdy powyższy kod C # lub VB jest kompilowany i wykonywany, daje następujący wynik -
Employee Id = 1, Name = William, Department Name = Account
Employee Id = 2, Name = Benjamin, Department Name = Account
Employee Id = 3, Name = Miley, Department Name = Sales
Press any key to continue.
Wykonywanie zapytań dotyczących zestawu danych za pomocą LinQ do zestawu danych
Przed rozpoczęciem wykonywania zapytań dotyczących zestawu danych za pomocą LINQ to Dataset ważne jest, aby załadować dane do zestawu danych i odbywa się to za pomocą klasy DataAdapter lub LINQ to SQL. Formułowanie zapytań przy użyciu LINQ to Dataset jest dość podobne do formułowania zapytań przy użyciu LINQ wraz z innymi źródłami danych z obsługą LINQ.
Zapytanie jednotabelowe
W poniższym zapytaniu z jedną tabelą wszystkie zamówienia online są zbierane z SalesOrderHeaderTtable, a następnie identyfikator zamówienia, data zamówienia oraz numer zamówienia są wyświetlane jako dane wyjściowe.
C#
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LinqToDataset {
class SingleTable {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
string sqlSelect = "SELECT * FROM Department;";
// Create the data adapter to retrieve data from the database
SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);
// Create table mappings
da.TableMappings.Add("Table", "Department");
// Create and fill the DataSet
DataSet ds = new DataSet();
da.Fill(ds);
DataTable department = ds.Tables["Department"];
var query = from d in department.AsEnumerable()
select new {
DepartmentId = d.Field<int>("DepartmentId"),
DepartmentName = d.Field<string>("Name")
};
foreach (var q in query) {
Console.WriteLine("Department Id = {0} , Name = {1}",
q.DepartmentId, q.DepartmentName);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Data.SqlClient
Imports System.Linq
Module LinqToDataSet
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim sqlSelect As String = "SELECT * FROM Department;"
Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
sqlCnn.Open()
Dim da As New SqlDataAdapter
da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)
da.TableMappings.Add("Table", "Department")
Dim ds As New DataSet()
da.Fill(ds)
Dim department As DataTable = ds.Tables("Department")
Dim query = From d In department.AsEnumerable()
Select New DepartmentDetail With {
.DepartmentId = d.Field(Of Integer)("DepartmentId"),
.DepartmentName = d.Field(Of String)("Name")
}
For Each e In query
Console.WriteLine("Department Id = {0} , Name = {1}", e.DepartmentId, e.DepartmentName)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
Public Class DepartmentDetail
Public Property DepartmentId As Integer
Public Property DepartmentName As String
End Class
End Module
Gdy powyższy kod C # lub VB jest kompilowany i wykonywany, daje następujący wynik -
Department Id = 1, Name = Account
Department Id = 2, Name = Sales
Department Id = 3, Name = Pre-Sales
Department Id = 4, Name = Marketing
Press any key to continue.
LINQ to XML oferuje łatwy dostęp do wszystkich funkcji LINQ, takich jak standardowe operatory zapytań, interfejs programistyczny itp. Zintegrowany z platformą .NET, LINQ to XML najlepiej wykorzystuje również funkcje platformy .NET, takie jak debugowanie, sprawdzanie w czasie kompilacji, silne pisanie i wiele więcej do powiedzenia.
Wprowadzenie LINQ to XML
Podczas korzystania z LINQ to XML ładowanie dokumentów XML do pamięci jest łatwe i łatwiejsze jest wykonywanie zapytań i modyfikowanie dokumentów. Możliwe jest również zapisywanie dokumentów XML istniejących w pamięci na dysk i ich serializowanie. Eliminuje to potrzebę uczenia się przez programistę języka zapytań XML, który jest dość złożony.
LINQ to XML ma swoją moc w przestrzeni nazw System.Xml.Linq. Zawiera wszystkie 19 klas niezbędnych do pracy z XML. Te klasy są następujące.
- XAttribute
- XCData
- XComment
- XContainer
- XDeclaration
- XDocument
- XDocumentType
- XElement
- XName
- XNamespace
- XNode
- XNodeDocumentOrderComparer
- XNodeEqualityComparer
- XObject
- XObjectChange
- XObjectChangeEventArgs
- XObjectEventHandler
- XProcessingInstruction
- XText
Przeczytaj plik XML za pomocą LINQ
DO#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace LINQtoXML {
class ExampleOfXML {
static void Main(string[] args) {
string myXML = @"<Departments>
<Department>Account</Department>
<Department>Sales</Department>
<Department>Pre-Sales</Department>
<Department>Marketing</Department>
</Departments>";
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(myXML);
var result = xdoc.Element("Departments").Descendants();
foreach (XElement item in result) {
Console.WriteLine("Department Name - " + item.Value);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq
Module Module1
Sub Main(ByVal args As String())
Dim myXML As String = "<Departments>" & vbCr & vbLf &
"<Department>Account</Department>" & vbCr & vbLf &
"<Department>Sales</Department>" & vbCr & vbLf &
"<Department>Pre-Sales</Department>" & vbCr & vbLf &
"<Department>Marketing</Department>" & vbCr & vbLf &
"</Departments>"
Dim xdoc As New XDocument()
xdoc = XDocument.Parse(myXML)
Dim result = xdoc.Element("Departments").Descendants()
For Each item As XElement In result
Console.WriteLine("Department Name - " + item.Value)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Gdy powyższy kod C # lub VB jest kompilowany i wykonywany, daje następujący wynik -
Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing
Press any key to continue.
Dodaj nowy węzeł
DO#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace LINQtoXML {
class ExampleOfXML {
static void Main(string[] args) {
string myXML = @"<Departments>
<Department>Account</Department>
<Department>Sales</Department>
<Department>Pre-Sales</Department>
<Department>Marketing</Department>
</Departments>";
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(myXML);
//Add new Element
xdoc.Element("Departments").Add(new XElement("Department", "Finance"));
//Add new Element at First
xdoc.Element("Departments").AddFirst(new XElement("Department", "Support"));
var result = xdoc.Element("Departments").Descendants();
foreach (XElement item in result) {
Console.WriteLine("Department Name - " + item.Value);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq
Module Module1
Sub Main(ByVal args As String())
Dim myXML As String = "<Departments>" & vbCr & vbLf &
"<Department>Account</Department>" & vbCr & vbLf &
"<Department>Sales</Department>" & vbCr & vbLf &
"<Department>Pre-Sales</Department>" & vbCr & vbLf &
"<Department>Marketing</Department>" & vbCr & vbLf &
"</Departments>"
Dim xdoc As New XDocument()
xdoc = XDocument.Parse(myXML)
xdoc.Element("Departments").Add(New XElement("Department", "Finance"))
xdoc.Element("Departments").AddFirst(New XElement("Department", "Support"))
Dim result = xdoc.Element("Departments").Descendants()
For Each item As XElement In result
Console.WriteLine("Department Name - " + item.Value)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Gdy powyższy kod C # lub VB jest kompilowany i wykonywany, daje następujący wynik -
Department Name - Support
Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance
Press any key to continue.
Usuwanie określonego węzła
DO#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace LINQtoXML {
class ExampleOfXML {
static void Main(string[] args) {
string myXML = @"<Departments>
<Department>Support</Department>
<Department>Account</Department>
<Department>Sales</Department>
<Department>Pre-Sales</Department>
<Department>Marketing</Department>
<Department>Finance</Department>
</Departments>";
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse(myXML);
//Remove Sales Department
xdoc.Descendants().Where(s =>s.Value == "Sales").Remove();
var result = xdoc.Element("Departments").Descendants();
foreach (XElement item in result) {
Console.WriteLine("Department Name - " + item.Value);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq
Module Module1
Sub Main(args As String())
Dim myXML As String = "<Departments>" & vbCr & vbLf &
"<Department>Support</Department>" & vbCr & vbLf &
"<Department>Account</Department>" & vbCr & vbLf &
"<Department>Sales</Department>" & vbCr & vbLf &
"<Department>Pre-Sales</Department>" & vbCr & vbLf &
"<Department>Marketing</Department>" & vbCr & vbLf &
"<Department>Finance</Department>" & vbCr & vbLf &
"</Departments>"
Dim xdoc As New XDocument()
xdoc = XDocument.Parse(myXML)
xdoc.Descendants().Where(Function(s) s.Value = "Sales").Remove()
Dim result = xdoc.Element("Departments").Descendants()
For Each item As XElement In result
Console.WriteLine("Department Name - " + item.Value)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
End Module
Gdy powyższy kod C # lub VB jest kompilowany i wykonywany, daje następujący wynik -
Department Name - Support
Department Name - Account
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance
Press any key to continue.
Będąc częścią ADO.NET Entity Framework, LINQ to Entities jest bardziej elastyczny niż LINQ to SQL, ale nie jest zbyt popularny ze względu na swoją złożoność i brak kluczowych funkcji. Jednak nie ma ograniczeń LINQ to SQL, które umożliwia wykonywanie zapytań o dane tylko w bazie danych SQL Server, ponieważ LINQ to Entities ułatwia wykonywanie zapytań o dane w dużej liczbie dostawców danych, takich jak Oracle, MySQL itp.
Co więcej, ma duże wsparcie ze strony ASP.Net w tym sensie, że użytkownicy mogą używać kontroli źródła danych do wykonywania zapytania za pośrednictwem LINQ to Entities i ułatwia wiązanie wyników bez konieczności dodatkowego kodowania.
Dzięki tym zaletom LINQ to Entities stało się obecnie standardowym mechanizmem użycia LINQ w bazach danych. Dzięki LINQ to Entities można również łatwo zmieniać szczegóły danych, których dotyczy zapytanie, i łatwo zatwierdzać aktualizację partii. Najbardziej intrygującym faktem dotyczącym LINQ to Entities jest to, że ma taką samą składnię jak SQL, a nawet ma tę samą grupę standardowych operatorów zapytań, takich jak Join, Select, OrderBy itp.
Proces tworzenia i wykonywania zapytań LINQ to Entities
Budowa ObjectQuery wystąpienie z ObjectContext (Połączenie jednostki)
Tworzenie zapytania w C # lub Visual Basic (VB) przy użyciu nowo utworzonego wystąpienia
Konwersja standardowych operatorów zapytań LINQ, a także wyrażeń LINQ do drzew poleceń
Wykonywanie zapytania i przekazywanie wszelkich wyjątków napotkanych bezpośrednio do klienta
Zwrócenie klientowi wszystkich wyników zapytania
ObjectContext jest tutaj podstawową klasą, która umożliwia interakcję z Entity Data Modellub innymi słowy działa jak most, który łączy LINQ z bazą danych. Drzewa poleceń są tutaj reprezentacją zapytań ze zgodnością z platformą Entity.
Z drugiej strony Entity Framework jest w rzeczywistości Object Relational Mapperogólnie w skrócie ORM przez programistów, który generuje obiekty biznesowe, a także encje zgodnie z tabelami bazy danych i ułatwia różne podstawowe operacje, takie jak tworzenie, aktualizowanie, usuwanie i odczytywanie. Na poniższej ilustracji przedstawiono strukturę jednostki i jej składniki.
Przykład ADD, UPDATE i DELETE przy użyciu LINQ z Entity Model
Najpierw dodaj model jednostki, wykonując poniższe kroki.
Step 1- Kliknij prawym przyciskiem myszy projekt i kliknij dodaj nowy element, otworzy się okno, jak pokazano poniżej. Wybierz Entity Data Model ADO.NET, określ nazwę i kliknij Dodaj.
Step 2 - Wybierz Generate from database.
Step 3 - Z menu rozwijanego wybierz opcję Połączenie z bazą danych.
Step 4 - Zaznacz wszystkie tabele.
Teraz napisz następujący kod.
using DataAccess;
using System;
using System.Linq;
namespace LINQTOSQLConsoleApp {
public class LinqToEntityModel {
static void Main(string[] args) {
using (LinqToSQLDBEntities context = new LinqToSQLDBEntities()) {
//Get the List of Departments from Database
var departmentList = from d in context.Departments
select d;
foreach (var dept in departmentList) {
Console.WriteLine("Department Id = {0} , Department Name = {1}",
dept.DepartmentId, dept.Name);
}
//Add new Department
DataAccess.Department department = new DataAccess.Department();
department.Name = "Support";
context.Departments.Add(department);
context.SaveChanges();
Console.WriteLine("Department Name = Support is inserted in Database");
//Update existing Department
DataAccess.Department updateDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 1);
updateDepartment.Name = "Account updated";
context.SaveChanges();
Console.WriteLine("Department Name = Account is updated in Database");
//Delete existing Department
DataAccess.Department deleteDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 3);
context.Departments.Remove(deleteDepartment);
context.SaveChanges();
Console.WriteLine("Department Name = Pre-Sales is deleted in Database");
//Get the Updated List of Departments from Database
departmentList = from d in context.Departments
select d;
foreach (var dept in departmentList) {
Console.WriteLine("Department Id = {0} , Department Name = {1}",
dept.DepartmentId, dept.Name);
}
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Termin „wyrażenie lambda” wywodzi swoją nazwę od rachunku „lambda”, który z kolei jest zapisem matematycznym stosowanym do definiowania funkcji. Wyrażenia lambda jako część wykonywalna równania LINQ tłumaczą logikę w sposób w czasie wykonywania, dzięki czemu można ją wygodnie przekazać do źródła danych. Jednak wyrażenia lambda nie są ograniczone tylko do znajdowania aplikacji tylko w LINQ.
Te wyrażenia są wyrażane za pomocą następującej składni -
(Input parameters) ⇒ Expression or statement block
Oto przykład wyrażenia lambda -
y ⇒ y * y
Powyższe wyrażenie określa parametr o nazwie y, a wartość y jest podniesiona do kwadratu. Jednak nie można wykonać wyrażenia lambda w tej formie. Przykład wyrażenia lambda w C # pokazano poniżej.
DO#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lambdaexample {
class Program {
delegate int del(int i);
static void Main(string[] args) {
del myDelegate = y ⇒ y * y;
int j = myDelegate(5);
Console.WriteLine(j);
Console.ReadLine();
}
}
}
VB
Module Module1
Private Delegate Function del(ByVal i As Integer) As Integer
Sub Main(ByVal args As String())
Dim myDelegate As del = Function(y) y * y
Dim j As Integer = myDelegate(5)
Console.WriteLine(j)
Console.ReadLine()
End Sub
End Module
Gdy powyższy kod C # lub VB jest kompilowany i wykonywany, daje następujący wynik -
25
Expression Lambda
Ponieważ wyrażenie w składni wyrażenia lambda pokazanego powyżej znajduje się po prawej stronie, są one również znane jako wyrażenie lambda.
Async Lambdas
Wyrażenie lambda utworzone przez włączenie przetwarzania asynchronicznego przy użyciu słowa kluczowego async jest znane jako async lambda. Poniżej znajduje się przykład asynchronicznej lambdy.
Func<Task<string>> getWordAsync = async()⇒ “hello”;
Lambda w standardowych operatorach zapytań
Wyrażenie lambda w operatorze zapytania jest oceniane przez to samo na żądanie i stale działa na każdym z elementów w sekwencji wejściowej, a nie na całej sekwencji. Wyrażenie Lambda umożliwia programistom podawanie własnej logiki do standardowych operatorów zapytań. W poniższym przykładzie deweloper użył operatora „Where”, aby odzyskać nieparzyste wartości z podanej listy, używając wyrażenia lambda.
DO#
//Get the average of the odd Fibonacci numbers in the series...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lambdaexample {
class Program {
static void Main(string[] args) {
int[] fibNum = { 1, 1, 2, 3, 5, 8, 13, 21, 34 };
double averageValue = fibNum.Where(num ⇒ num % 2 == 1).Average();
Console.WriteLine(averageValue);
Console.ReadLine();
}
}
}
VB
Module Module1
Sub Main()
Dim fibNum As Integer() = {1, 1, 2, 3, 5, 8, 13, 21, 34}
Dim averageValue As Double = fibNum.Where(Function(num) num Mod 2 = 1).Average()
Console.WriteLine(averageValue)
Console.ReadLine()
End Sub
End Module
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
7.33333333333333
Wnioskowanie o typie w Lambda
W języku C # wnioskowanie o typie jest wygodnie używane w różnych sytuacjach, a także bez jawnego określania typów. Jednak w przypadku wyrażenia lambda wnioskowanie o typie będzie działać tylko wtedy, gdy każdy typ został określony, ponieważ kompilator musi być spełniony. Rozważmy następujący przykład.
delegate int Transformer (int i);
W tym przypadku kompilator wykorzystuje wnioskowanie o typie, aby skorzystać z faktu, że x jest liczbą całkowitą, a odbywa się to poprzez badanie typu parametru Transformera.
Zmienny zakres w wyrażeniu lambda
Istnieją pewne reguły dotyczące używania zakresu zmiennej w wyrażeniu lambda, na przykład zmienne inicjowane w wyrażeniu lambda nie mają być widoczne w metodzie zewnętrznej. Istnieje również reguła, że przechwycona zmienna nie ma być zbierana bez pamięci, chyba że delegat odwołujący się do tego samego staje się kwalifikowalny do aktu czyszczenia pamięci. Ponadto istnieje reguła, która zabrania instrukcji return w wyrażeniu lambda, aby spowodować zwrócenie otaczającej metody.
Oto przykład pokazujący zakres zmiennych w wyrażeniu lambda.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lambdaexample {
class Program {
delegate bool D();
delegate bool D2(int i);
class Test {
D del;
D2 del2;
public void TestMethod(int input) {
int j = 0;
// Initialize the delegates with lambda expressions.
// Note access to 2 outer variables.
// del will be invoked within this method.
del = () ⇒ { j = 10; return j > input; };
// del2 will be invoked after TestMethod goes out of scope.
del2 = (x) ⇒ { return x == j; };
// Demonstrate value of j:
// The delegate has not been invoked yet.
Console.WriteLine("j = {0}", j); // Invoke the delegate.
bool boolResult = del();
Console.WriteLine("j = {0}. b = {1}", j, boolResult);
}
static void Main() {
Test test = new Test();
test.TestMethod(5);
// Prove that del2 still has a copy of
// local variable j from TestMethod.
bool result = test.del2(10);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
j = 0
j = 10. b = True
True
Drzewo wyrażeń
Wyrażenia lambda są używane w Expression Treeszeroko zakrojona budowa. Drzewo wyrażeń udostępnia kod w strukturze danych przypominającej drzewo, w którym każdy węzeł sam jest wyrażeniem, takim jak wywołanie metody, lub może być operacją binarną, taką jak x <y. Poniżej znajduje się przykład użycia wyrażenia lambda do budowy drzewa wyrażeń.
Oświadczenie Lambda
Jest również statement lambdasskładają się z dwóch lub trzech instrukcji, ale nie są używane w konstrukcji drzew wyrażeń. Instrukcja powrotu musi być zapisana w wyrażeniu lambda.
Składnia wyrażenia lambda
(params)⇒ {statements}
Przykład wyrażenia lambda
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
namespace lambdaexample {
class Program {
static void Main(string[] args) {
int[] source = new[] { 3, 8, 4, 6, 1, 7, 9, 2, 4, 8 };
foreach (int i in source.Where(x ⇒
{
if (x <= 3)
return true;
else if (x >= 7)
return true;
return false;
}
))
Console.WriteLine(i);
Console.ReadLine();
}
}
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
3
8
1
7
9
2
8
Lambdy są używane jako argumenty w zapytaniach LINQ opartych na metodach i nigdy nie mogą mieć miejsca po lewej stronie operatorów, takich jak is lub aspodobnie jak metody anonimowe. Chociaż wyrażenia Lambda są bardzo podobnymi metodami anonimowymi, nie są one wcale ograniczone do używania tylko jako delegatów.
O czym należy pamiętać używając wyrażeń lambda
Wyrażenie lambda może zwracać wartość i może mieć parametry.
Parametry można definiować na wiele sposobów za pomocą wyrażenia lambda.
Jeśli w wyrażeniu lambda znajduje się pojedyncza instrukcja, nie ma potrzeby stosowania nawiasów klamrowych, podczas gdy w przypadku wielu instrukcji niezbędne są nawiasy klamrowe oraz zwracana wartość.
Dzięki wyrażeniom lambda możliwy jest dostęp do zmiennych znajdujących się poza blokiem wyrażenia lambda za pomocą funkcji znanej jako zamknięcie. Używanie zamknięcia powinno być wykonywane ostrożnie, aby uniknąć jakiegokolwiek problemu.
Niemożliwe jest wykonanie niebezpiecznego kodu wewnątrz żadnego wyrażenia lambda.
Wyrażenia lambda nie powinny być używane po lewej stronie operatora.
Jako zestaw rozszerzeń platformy .NET, LINQ jest preferowanym mechanizmem dostępu do danych przez programistów ASP.NET. ASP.NET 3.5 ma wbudowaną kontrolę narzędzia LINQDataSource, która umożliwia łatwe użycie LINQ w ASP.NET. ASP.NET wykorzystuje wyżej wymienioną kontrolkę jako źródło danych. Rzeczywiste projekty obejmują głównie witryny internetowe lub aplikacje Windows, więc aby lepiej zrozumieć koncepcję LINQ z ASP.NET, zacznijmy od stworzenia witryny ASP.NET, która korzysta z funkcji LINQ.
W tym celu konieczne jest zainstalowanie w systemie Visual Studio i .NET Framework. Po otwarciu programu Visual Studio przejdź do Plik → Nowy → Witryna internetowa. Otworzy się wyskakujące okienko, jak pokazano na poniższym rysunku.
Teraz pod szablonami po lewej stronie będą dostępne dwie opcje językowe do stworzenia strony internetowej. WybieraćVisual C# i wybierz ASP.NET Empty Web Site.
Wybierz folder, w którym chcesz zapisać nowy serwis WWW w swoim systemie. Następnie wciśnijOK i tak dalej Solution Explorerpojawia się na ekranie zawierającym wszystkie pliki internetowe. Kliknij prawym przyciskiem myszy Default.aspx w Eksploratorze rozwiązań i wybierz opcję Wyświetl w przeglądarce, aby wyświetlić w przeglądarce domyślną witrynę ASP.NET. Wkrótce Twoja nowa witryna ASP.NET zostanie otwarta w przeglądarce internetowej, jak pokazano na poniższym zrzucie ekranu.
.aspx jest w rzeczywistości głównym rozszerzeniem plików używanym w witrynach internetowych ASP.NET. Program Visual Studio domyślnie tworzy wszystkie niezbędne strony dla podstawowej witryny sieci Web, takiej jakHome page i About Usstronę, na której możesz wygodnie umieścić swoje treści. Kod strony internetowej jest generowany automatycznie tutaj i można go również wyświetlić.
Kontrolka LINQDataSource
Jest to możliwe UPDATE, INSERT i DELETEdane na stronach witryny ASP.NET za pomocą kontrolki LINQDataSource. Nie ma absolutnie potrzeby określania poleceń SQL, ponieważ formant LINQDataSource wykorzystuje dynamicznie tworzone polecenia do takich operacji.
Kontrolka umożliwia użytkownikowi wygodne korzystanie z LINQ na stronie sieci Web ASP.NET przez ustawienie właściwości w tekście znaczników. LINQDataSource jest bardzo podobny do kontrolek, takich jakSqlDataSource jak również ObjectDataSourceponieważ może być używany do wiązania innych formantów ASP.NET obecnych na stronie ze źródłem danych. Więc musimy miećdatabase aby wyjaśnić różne funkcje wywoływane przez kontrolkę LINQDataSource.
Przed przystąpieniem do objaśniania użycia formantu w formularzu strony internetowej ASP.NET, konieczne jest otwarcie Microsoft Visual Studio Toolbox i przeciągnięcie i upuszczenie kontrolki LINQDataSource na stronę .aspx witryny ASP.NET, jak na poniższym rysunku.
Następnym krokiem jest skonfigurowanie LINQDataSource przez wybranie wszystkich kolumn rekordu pracownika.
Teraz dodaj kontrolkę GridView do strony .aspx i skonfiguruj ją tak, jak pokazano na poniższym rysunku. Kontrolka GridView jest zaawansowana i zapewnia elastyczność pracy z danymi. Wkrótce po skonfigurowaniu sterowania pojawi się on w przeglądarce.
Kodowanie strony .aspx, które można teraz wyświetlić na ekranie, to -
<!DOCTYPE html>
<html>
<head runat = "server">
<title></title>
</head>
<body>
<form id = "form1" runat = "server">
<div>
<asp:GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False"
DataKeyNames = "ContactID" DataSourceID = "LINQDataSource1">
<Columns>
<asp:BoundField DataField = "ContactID" HeaderText = "ContactID"
InsertVisible = "False" ReadOnly="True" SortExpression = "ContactID" />
<asp:CheckBoxField DataField = "NameStyle" HeaderText = "NameStyle"
SortExpression = "NameStyle" />
<asp:BoundField DataField = "Title" HeaderText = "Title" SortExpression = "Title" />
<asp:BoundField DataField = "FirstName" HeaderText = "FirstName"
SortExpression="FirstName" />
<asp:BoundField DataField = "MiddleName" HeaderText = "MiddleName"
SortExpression = "MiddleName" />
<asp:BoundField DataField = "LastName" HeaderText = "LastName"
SortExpression = "LastName" />
<asp:BoundField DataField = "Suffix" HeaderText = "Suffix"
SortExpression = "Suffix" />
<asp:BoundField DataField = "EmailAddress" HeaderText = "EmailAddress"
SortExpression = "EmailAddress" />
</Columns>
</asp:GridView>
<br />
</div>
<asp:LINQDataSource ID = "LINQDataSource1" runat = "server"
ContextTypeName = "LINQWebApp1.AdventureWorksDataContext" EntityTypeName = ""
TableName = "Contacts">
</asp:LINQDataSource>
</form>
</body>
</html>
W tym miejscu należy zauważyć, że konieczne jest ustawienie właściwości ContextTypeName na klasę reprezentującą bazę danych. Na przykład tutaj jest podany jako LINQWebApp1.AdventureWorksDataContext, ponieważ ta akcja utworzy wymagane połączenie między LINQDataSource a bazą danych.
WSTAW, AKTUALIZUJ i USUŃ dane na stronie ASP.NET przy użyciu LINQ
Po dokładnym wykonaniu wszystkich powyższych kroków wybierz plik LINQDataSource Tasks z LINQDataSource Control i wybierz wszystkie trzy pola do włączania wstawiania, włączania aktualizacji i włączania usuwania z tego samego, jak pokazano na poniższym zrzucie ekranu.
Wkrótce deklaratywny znacznik zostanie wyświetlony na ekranie jako następujący.
<asp:LINQDataSource
ContextTypeName = "LINQWebApp1.AdventureWorksDataContext"
TableName = "Contacts"
EnableUpdate = "true"
EnableInsert = "true"
EnableDelete = "true"
ID = "LINQDataSource1"
runat = "server">
</asp:LINQDataSource>
Ponieważ istnieje wiele wierszy i kolumn, lepiej jest dodać kolejną kontrolkę w formularzu .aspx o nazwie jako Widok szczegółów lub Kontrolka główna poniżej kontrolki Widok siatki, aby wyświetlić tylko szczegóły wybranego wiersza siatki. Wybierz Zadania widoku szczegółowego z kontrolki Widok szczegółowy i zaznacz pola wyboru, jak pokazano poniżej.
Teraz po prostu zapisz zmiany i naciśnij Ctrl + F5, aby wyświetlić stronę w przeglądarce, gdzie można teraz usunąć, zaktualizować, wstawić dowolny rekord w kontrolce widoku szczegółów.