LINQ - Übersicht
Entwickler auf der ganzen Welt hatten immer Probleme beim Abfragen von Daten, da kein definierter Pfad vorhanden war und sie eine Vielzahl von Technologien wie SQL, Web Services, XQuery usw. beherrschen mussten.
LINQ (Language Integrated Query) wurde in Visual Studio 2008 eingeführt und von Anders Hejlsberg entworfen. Es ermöglicht das Schreiben von Abfragen auch ohne Kenntnisse von Abfragesprachen wie SQL, XML usw. LINQ-Abfragen können für verschiedene Datentypen geschrieben werden.
Beispiel einer LINQ-Abfrage
C #
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
Wenn der obige Code von C # oder VB kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
hello
LINQ
world
Syntax von LINQ
Es gibt zwei Syntaxen von LINQ. Dies sind die folgenden.
Lamda (Methode) Syntax
var longWords = words.Where( w ⇒ w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)
Abfragesyntax (Verständnis)
var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10
Arten von LINQ
Die Arten von LINQ werden im Folgenden kurz erwähnt.
- LINQ zu Objekten
- LINQ zu XML (XLINQ)
- LINQ zu DataSet
- LINQ zu SQL (DLINQ)
- LINQ zu Entitäten
Abgesehen von den oben genannten gibt es auch einen LINQ-Typ namens PLINQ, bei dem es sich um den parallelen LINQ von Microsoft handelt.
LINQ-Architektur in .NET
LINQ verfügt über eine dreischichtige Architektur, bei der die oberste Schicht aus den Spracherweiterungen und die unterste Schicht aus Datenquellen besteht, bei denen es sich normalerweise um Objekte handelt, die generische IEnumerable <T> - oder IQueryable <T> -Schnittstellen implementieren. Die Architektur ist unten dargestellt.
Abfrageausdrücke
Der Abfrageausdruck ist nichts anderes als eine LINQ-Abfrage, die in einer ähnlichen Form wie SQL mit Abfrageoperatoren wie Select, Where und OrderBy ausgedrückt wird. Abfrageausdrücke beginnen normalerweise mit dem Schlüsselwort "Von".
Um auf Standard-LINQ-Abfrageoperatoren zuzugreifen, sollte der Namespace System.Query standardmäßig importiert werden. Diese Ausdrücke werden in einer deklarativen Abfragesyntax geschrieben, die C # 3.0 war.
Im Folgenden finden Sie ein Beispiel für eine vollständige Abfrageoperation, die aus der Erstellung von Datenquellen, der Definition von Abfrageausdrücken und der Ausführung von Abfragen besteht.
C #
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();
}
}
}
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
97 92 81
Erweiterungsmethoden
Mit .NET 3.5 eingeführt, werden Erweiterungsmethoden nur in statischen Klassen deklariert und ermöglichen die Aufnahme benutzerdefinierter Methoden in Objekte, um einige präzise Abfrageoperationen zum Erweitern einer Klasse auszuführen, ohne tatsächlich Mitglied dieser Klasse zu sein. Diese können auch überlastet werden.
Kurz gesagt, Erweiterungsmethoden werden verwendet, um Abfrageausdrücke in herkömmliche Methodenaufrufe (objektorientiert) zu übersetzen.
Unterschied zwischen LINQ und gespeicherter Prozedur
Es gibt eine Reihe von Unterschieden zwischen LINQ- und gespeicherten Prozeduren. Diese Unterschiede werden unten erwähnt.
Gespeicherte Prozeduren sind viel schneller als eine LINQ-Abfrage, da sie einem erwarteten Ausführungsplan folgen.
Es ist einfach, Laufzeitfehler beim Ausführen einer LINQ-Abfrage zu vermeiden, als im Vergleich zu einer gespeicherten Prozedur, da diese die Intellisense-Unterstützung von Visual Studio sowie die vollständige Typprüfung während der Kompilierungszeit bietet.
LINQ ermöglicht das Debuggen mithilfe des .NET-Debuggers, der bei gespeicherten Prozeduren nicht vorhanden ist.
LINQ bietet Unterstützung für mehrere Datenbanken im Gegensatz zu gespeicherten Prozeduren, bei denen es wichtig ist, den Code für verschiedene Arten von Datenbanken neu zu schreiben.
Die Bereitstellung einer LINQ-basierten Lösung ist im Vergleich zur Bereitstellung einer Reihe gespeicherter Prozeduren einfach und unkompliziert.
Need For LINQ
Vor LINQ war es wichtig, C #, SQL und verschiedene APIs zu lernen, die beide miteinander verbinden, um eine vollständige Anwendung zu bilden. Da diese Datenquellen und Programmiersprachen einer Impedanzfehlanpassung ausgesetzt sind; Es besteht die Notwendigkeit einer kurzen Codierung.
Im Folgenden finden Sie ein Beispiel dafür, wie viele verschiedene Techniken von den Entwicklern beim Abfragen von Daten vor dem Aufkommen von LINQ verwendet wurden.
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)
Interessanterweise wird die Abfrage von den vorgestellten Codezeilen nur durch die letzten beiden definiert. Mit LINQ kann dieselbe Datenabfrage in kürzerer Zeit in einer lesbaren farbcodierten Form wie der folgenden geschrieben werden.
Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;
Vorteile von LINQ
LINQ bietet eine Reihe von Vorteilen, darunter vor allem die starke Ausdruckskraft, mit der Entwickler deklarativ ausdrücken können. Einige der anderen Vorteile von LINQ sind unten angegeben.
LINQ bietet Syntaxhervorhebungen, die sich als hilfreich erweisen, um Fehler während der Entwurfszeit herauszufinden.
LINQ bietet IntelliSense, was bedeutet, dass Sie einfach genauere Abfragen schreiben können.
Das Schreiben von Codes ist in LINQ sehr viel schneller und somit wird auch die Entwicklungszeit erheblich verkürzt.
LINQ erleichtert das Debuggen aufgrund seiner Integration in die C # -Sprache.
Das Anzeigen der Beziehung zwischen zwei Tabellen ist mit LINQ aufgrund seiner hierarchischen Funktion einfach. Dadurch können Abfragen erstellt werden, die mehrere Tabellen in kürzerer Zeit verbinden.
LINQ ermöglicht die Verwendung einer einzelnen LINQ-Syntax beim Abfragen vieler verschiedener Datenquellen. Dies liegt hauptsächlich an der einheitlichen Grundlage.
LINQ ist erweiterbar, dh es ist möglich, das Wissen über LINQ zum Abfragen neuer Datenquellentypen zu verwenden.
LINQ bietet die Möglichkeit, mehrere Datenquellen in einer einzigen Abfrage zusammenzuführen und komplexe Probleme in eine Reihe von kurzen Abfragen zu unterteilen, die leicht zu debuggen sind.
LINQ bietet eine einfache Transformation für die Konvertierung eines Datentyps in einen anderen, wie die Transformation von SQL-Daten in XML-Daten.