Was ist LINQ und was macht es? [geschlossen]

126

Was ist LINQ? Ich weiß, es ist für Datenbanken, aber was macht es?

Kredns
quelle
20
Ich glaube, ich habe die Kriterien "kann nicht vernünftig beantwortet werden" besiegt. Es gibt keinen Grund, warum diese Frage geschlossen werden sollte.
Amy B
1
Hören Sie dem Schöpfer von LINQ, Erik Meijer, zu, was es ist. Übrigens ist es nicht nur für die Datenbank.
Sнаđошƒаӽ

Antworten:

171

LINQ steht für Language Integrated Query .

Anstatt YAQL (Yet Another Query Language) zu schreiben, boten Microsoft-Sprachentwickler die Möglichkeit, Abfragen direkt in ihren Sprachen (z. B. C # und Visual Basic) auszudrücken. Die Techniken zum Erstellen dieser Abfragen basieren nicht auf den Implementierungsdetails des abgefragten Objekts, sodass Sie gültige Abfragen für viele Ziele (Datenbanken, In-Memory-Objekte, XML) schreiben können, ohne die zugrunde liegende Art und Weise zu berücksichtigen, in der die Abfragen ausgeführt werden Abfrage wird ausgeführt.

Beginnen wir diese Untersuchung mit den Teilen, die zum .NET Framework (3.5) gehören.

  • LINQ To Objects - Untersuchen Sie System.Linq.Enumerable auf Abfragemethoden. Diese zielen darauf ab IEnumerable<T>, dass jede typisierte schleifenfähige Sammlung typsicher abgefragt werden kann. Diese Abfragen basieren auf kompilierten .NET-Methoden, nicht auf Ausdrücken.

  • LINQ To Anything - Untersuchen Sie System.Linq.Queryable auf einige Abfragemethoden. Diese Ziele IQueryable<T>ermöglichen die Erstellung von Ausdrucksbäumen, die von der zugrunde liegenden Implementierung übersetzt werden können.

  • Ausdrucksbäume - Untersuchen Sie den System.Linq.Expressions- Namespace. Dies ist Code als Daten. In der Praxis sollten Sie sich dieser Dinge bewusst sein, müssen aber keinen Code für diese Typen schreiben. Mit Sprachfunktionen (wie Lambda-Ausdrücken) können Sie verschiedene Kurzzeiger verwenden, um zu vermeiden, dass Sie direkt mit diesen Typen umgehen.

  • LINQ To SQL - Untersuchen Sie den System.Data.Linq- Namespace. Beachten Sie besonders die DataContext. Dies ist eine DataAccess-Technologie, die vom C # -Team entwickelt wurde. Es funktioniert einfach.

  • LINQ To Entities - Untersuchen Sie den System.Data.Objects- Namespace. Beachten Sie besonders die ObjectContext. Dies ist eine DataAccess-Technologie, die vom ADO.NET-Team entwickelt wurde. Es ist komplex, leistungsstark und schwieriger zu verwenden als LINQ To SQL.

  • LINQ To XML - Untersuchen Sie den System.Xml.Linq- Namespace. Im Wesentlichen waren die Leute mit dem Zeug nicht zufrieden System.Xml. Microsoft hat es also neu geschrieben und das Umschreiben genutzt, um einige Methoden einzuführen, die die Verwendung von LINQ To Objects gegen XML vereinfachen.

  • Einige nette Hilfstypen wie Func und Action . Diese Typen sind Delegierte mit allgemeiner Unterstützung. Vorbei sind die Zeiten, in denen Sie Ihre eigenen benutzerdefinierten (und nicht austauschbaren) Delegatentypen deklariert haben.

Alle oben genannten Funktionen sind Teil von .NET Framework und in jeder .NET-Sprache (VB.NET, C #, IronPython, COBOL .NET usw.) verfügbar.


Ok, weiter zu den Sprachfunktionen. Ich werde mich an C # halten, da ich das am besten weiß. VB.NET hatte auch einige ähnliche Verbesserungen (und ein paar, die C # nicht bekam - XML-Literale). Dies ist eine kurze und unvollständige Liste.

  • Erweiterungsmethoden - Hiermit können Sie eine zu tippende Methode "hinzufügen". Die Methode ist eine statische Methode, die an eine Instanz des Typs übergeben wird und auf den öffentlichen Auftrag des Typs beschränkt ist. Sie ist jedoch sehr nützlich, um Methoden zu Typen hinzuzufügen, die Sie nicht steuern (Zeichenfolge) oder hinzufügen (vollständig implementiert) ) Hilfsmethoden für Schnittstellen.

  • Abfrageverständnis-Syntax - Hiermit können Sie in eine SQL-ähnliche Struktur schreiben. All diese Dinge werden in die Methoden von System.Linq.Queryable oder System.Linq.Enumerable übersetzt (abhängig vom Typ meiner Kunden). Es ist völlig optional und Sie können LINQ auch ohne verwenden. Ein Vorteil dieser Art der Abfragedeklaration besteht darin, dass die Bereichsvariablen einen Gültigkeitsbereich haben: Sie müssen nicht für jede Klausel neu deklariert werden.

    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
  • Lambda-Ausdrücke - Dies ist eine Abkürzung zum Angeben einer Methode. Der C # -Compiler übersetzt jede entweder in eine anonyme Methode oder in eine wahre System.Linq.Expressions.Expression. Sie müssen diese wirklich verstehen, um Linq gut nutzen zu können. Es gibt drei Teile: eine Parameterliste, einen Pfeil und einen Methodenkörper.

    IEnumerable<string> result = myCustomers
     .Where(c => c.Name.StartsWith("B"))
     .Select(c => c.Name);`
  • Anonyme Typen - Manchmal verfügt der Compiler über genügend Informationen, um einen Typ für Sie zu erstellen. Diese Typen sind nicht wirklich anonym: Der Compiler benennt sie, wenn er sie erstellt. Diese Namen werden jedoch zur Kompilierungszeit erstellt, was für einen Entwickler zu spät ist, um diesen Namen zur Entwurfszeit zu verwenden.

    myCustomers.Select(c => new 
    {
      Name = c.Name;
      Age = c.Age;
    })
  • Implizite Typen - Manchmal verfügt der Compiler über genügend Informationen aus einer Initialisierung, um den Typ für Sie herauszufinden. Sie können den Compiler anweisen, dies mit dem Schlüsselwort var zu tun. Die implizite Eingabe ist erforderlich, um Variablen für anonyme Typen zu deklarieren, da Programmierer möglicherweise nicht den Namen eines anonymen Typs verwenden.

    // The compiler will determine that names is an IEnumerable<string>
    var names = myCustomers.Select(c => c.Name);
Amy B.
quelle
14

LINQ (Language INtegrated Query) kann sich beziehen auf:

  • eine Bibliothek zur Sammlung und Iteratormanipulation, die Funktionen höherer Ordnung in großem Umfang als Argumente verwendet (System.Linq)

  • eine Bibliothek zum Übergeben und Bearbeiten einfacher Funktionen als abstrakte Syntaxbäume (System.Linq.Expressions)

  • Eine Syntaxerweiterung für verschiedene Sprachen, um eine SQL-ähnliche Syntax für die Verarbeitung von Sammlungen, eine kompaktere Notation für anonyme Funktionen und einen Mechanismus zur Einführung statischer Hilfsfunktionen bereitzustellen, die syntaktisch nicht von den Funktionen der endgültigen Elemente zu unterscheiden sind

  • eine Schnittstellendefinition, an die sich Datenanbieter anpassen können, um die Abfragestruktur zu empfangen und möglicherweise eine Optimierung daran durchzuführen, oder gelegentlich die kompatiblen Datenanbieter selbst

Die Komponenten können isoliert oder kombiniert verwendet werden.

Jeffrey Hantin
quelle
10

Kurz gesagt, mit LINQ (Language-Integrated Query) können Sie Abfragen direkt in Ihren Code schreiben. Diese Abfragen können sich auf relationale Datenbanken, aber auch auf XML- oder speicherinterne Containerobjekte wie Arrays und Listen beziehen. Weitere Informationen finden Sie in der MSDN-Bibliothek: http://msdn.microsoft.com/en-us/library/bb308959.aspx

Vojislav Stojkovic
quelle
das ist präzise und prägnant.
SSD
6

Ich werde versuchen, eine einfache Antwort zu finden: Mit LINQ können Sie Ihre Datenbank (oder einen anderen Datenspeicher, XML usw.) mit einer Abfragesprache abfragen, die SQL ähnelt, aber in einer .NET-Anwendung kompiliert werden kann.

jcollum
quelle
1
Was genau ist der Unterschied zwischen Linq und SQL?
Kredns
Ich denke, es gibt einen komplexeren Namen dafür, aber die Strukturen unterscheiden sich: SQL ist Select From Where und LINQ ist From Where Select. LINQ ist einfacher zu schleifen. LINQ ist einfach einfacher :) und das von ihm erzeugte SQL ist angesichts der Zeitersparnis normalerweise gut genug.
JCollum
2
man könnte um ehrlich zu sein, argumentiert SQL soll geschrieben werden From Where Select, etc.- dh , es in der Art und Weise geschrieben werden soll , dass die Ergebnismenge tatsächlich gebildet wird
Don Cheadle
6

LINQ steht für Language Integrated Query und ist eine Möglichkeit, einen allgemeinen Abfragemechanismus in der CLR bereitzustellen.

Auf der einfachsten Ebene besteht dies aus einer Reihe von Methoden für IEnumerable <T> - z. B. Select, Sum, Where -, die für Einschränkungen, Projektionen usw. verwendet werden können. [1]

Um noch ein bisschen weiter zu gehen, definiert LINQ auch ein neues LINQ-Anbietermodell, das einen Ausdrucksbaum verwenden kann, um "native" Abfragen für eine Datenquelle außerhalb der CLR auszuführen - z. B. LINQ zu SQL, LINQ zu XML, LINQ zu NHibernate usw.

C # und VB.NET haben außerdem eine Abfragesyntax definiert, mit der Sie stark typisierte Abfragen inline schreiben können (die SQL sehr ähnlich sieht), die der Compiler dann in die entsprechenden IEnumerable <T> -Aufrufe übersetzt.

Für mich ist das Interessanteste an LINQ, dass alle C # - und VB.NET-Funktionen, die zur Unterstützung benötigt wurden, für sich genommen nützlich sind. Erweiterungsmethoden, anonyme Typen, Lambda-Ausdrücke und implizite Typisierung waren erforderlich, um LINQ zu unterstützen. Wir verwenden diese Funktionen jedoch eher außerhalb eines reinen LINQ-Kontexts.

[1] Dies sind relationale Begriffe, funktionale Programmierer würden wahrscheinlich Map, Reduce, Fold usw. bevorzugen.

Mark Brackett
quelle
5

LINQ ist eine Technologie zum Extrahieren von Daten unter Verwendung einer aus der Programmiersprache C # abgeleiteten Sprache. Während es SQL viel an funktionalem Design zu verdanken hat, ist es im Grunde eine eigene Sprache für die Datenabfrage. Es funktioniert in einem breiten Spektrum von Datenquellen (SQL-Datenbanken, In-Memory-Darstellungen, XML usw.). Insbesondere LINQ-To-SQL sollte als Kontrast zur traditionellen Verwendung von eingebettetem SQL gesehen werden, das unter einer häufig als "Impedanzfehlanpassung" bezeichneten Abweichung zwischen der SQL-Programmierung und der C # / VB-Programmierung leidet.

Für eine Diskussion über LINQ und seine Einschränkungen möchten Sie vielleicht einen Blick auf diese verwandte Frage werfen: Verpasst LINQ to SQL nicht den Punkt?

Mark Brittingham
quelle
0

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

"Das LINQ-Projekt ist ein Codename für eine Reihe von Erweiterungen von .NET Framework, die sprachintegrierte Abfrage-, Set- und Transformationsvorgänge umfassen. Es erweitert C # und Visual Basic um die Syntax der Muttersprache für Abfragen und bietet Klassenbibliotheken, die genutzt werden können diese Fähigkeiten. "

Jobo
quelle
Also ist es für Datenbanken? Denn was ich hier (in SO) gesehen habe, ist eher für Sammlungen in der .net-Umgebung.
OscarRyz