LINQ - przegląd
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 internetowe, 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 bez bycia rzeczywistym członkiem tej klasy. Mogą być również 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 w czasie 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 ilustrujący, 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, 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. Poniżej przedstawiono niektóre inne zalety LINQ.
LINQ oferuje podświetlanie składni, które okazuje się pomocne w znajdowaniu błędów w czasie projektowania.
LINQ oferuje technologię 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ę, co 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.