Aktivieren einer Datenquelle für LINQ-AbfragenEnabling a Data Source for LINQ Querying

Es gibt verschiedene Möglichkeiten, LINQLINQ zu erweitern, um die Abfrage einer beliebigen Datenquelle im LINQLINQ-Muster zu ermöglichen.There are various ways to extend LINQLINQ to enable any data source to be queried in the LINQLINQ pattern. Bei der Datenquelle kann es sich u. a. um eine Datenstruktur, einen Webdienst, ein Dateisystem oder eine Datenbank handeln.The data source might be a data structure, a Web service, a file system, or a database, to name some. Das LINQLINQ-Muster erleichtert Clients das Ausführen von Abfragen für eine Datenquelle mit aktivierter LINQLINQ-Abfrage, da die Syntax und das Muster der Abfrage unverändert bleiben.The LINQLINQ pattern makes it easy for clients to query a data source for which LINQLINQ querying is enabled, because the syntax and pattern of the query does not change. LINQLINQ kann u.a. auf folgende Weisen für die Verwendung dieser Datenquellen erweitert werden:The ways in which LINQLINQ can be extended to these data sources include the following:

  • Implementieren der IEnumerable<T>-Schnittstelle in einem Typ, um LINQLINQ to Objects-Abfragen für diesen Typ zu aktivieren.Implementing the IEnumerable<T> interface in a type to enable LINQLINQ to Objects querying of that type.

  • Erstellen von Standardabfrageoperator-Methoden wie Where und Select, die einen Typ erweitern, um benutzerdefinierte LINQLINQ-Abfragen für diesen Typ zu aktivieren.Creating standard query operator methods such as Where and Select that extend a type, to enable custom LINQLINQ querying of that type.

  • Erstellen eines Anbieters für die Datenquelle, die die IQueryable<T>-Schnittstelle implementiert.Creating a provider for your data source that implements the IQueryable<T> interface. Ein Anbieter, der diese Schnittstelle implementiert, empfängt LINQLINQ-Abfragen in Form von Ausdrucksbaumstrukturen, die er benutzerdefiniert ausführen kann, beispielsweise im Remotemodus.A provider that implements this interface receives LINQLINQ queries in the form of expression trees, which it can execute in a custom way, for example remotely.

  • Erstellen eines Anbieters für die Datenquelle, die eine vorhandene LINQLINQ-Technologie nutzt.Creating a provider for your data source that takes advantage of an existing LINQLINQ technology. Durch einen solchen Anbieter werden nicht nur Abfragen ermöglicht, sondern zusätzlich Einfüge-, Aktualisierungs- und Löschvorgänge sowie Zuordnungen für benutzerdefinierte Typen.Such a provider would enable not only querying, but also insert, update, and delete operations and mapping for user-defined types.

In diesem Thema werden diese Möglichkeiten erläutert.This topic discusses these options.

Aktivieren von LINQ-Abfragen für eine DatenquelleHow to Enable LINQ Querying of Your Data Source

Daten im ArbeitsspeicherIn-Memory Data

Es gibt zwei Möglichkeiten, LINQLINQ-Abfragen von Daten im Arbeitsspeicher zu aktivieren.There are two ways you can enable LINQLINQ querying of in-memory data. Wenn die Daten über einen Typ verfügen, der IEnumerable<T> implementiert, können Sie sie mithilfe von LINQLINQ to Objects abfragen.If the data is of a type that implements IEnumerable<T>, you can query the data by using LINQLINQ to Objects. Wenn es nicht sinnvoll ist, die Enumeration des Typs durch Implementierung der IEnumerable<T>-Schnittstelle zu aktivieren, können Sie LINQLINQ-Standardabfrageoperator-Methoden in diesem Typ definieren oder LINQLINQ-Standardabfrageoperator-Methoden erstellen, die den Typ erweitern.If it does not make sense to enable enumeration of your type by implementing the IEnumerable<T> interface, you can define LINQLINQ standard query operator methods in that type or create LINQLINQ standard query operator methods that extend the type. Benutzerdefinierte Implementierungen der Standardabfrageoperatoren sollten zur Rückgabe der Ergebnisse eine verzögerte Ausführung verwenden.Custom implementations of the standard query operators should use deferred execution to return the results.

RemotedatenRemote Data

Die beste Möglichkeit zur Aktivierung von LINQLINQ-Abfragen für eine Remotedatenquelle besteht darin, die IQueryable<T>-Schnittstelle zu implementieren.The best option for enabling LINQLINQ querying of a remote data source is to implement the IQueryable<T> interface. Dieser Ansatz unterscheidet sich jedoch vom Erweitern eines Anbieters wie LINQ to SQLLINQ to SQL für eine Datenquelle.However, this differs from extending a provider such as LINQ to SQLLINQ to SQL for a data source. Es stehen keine Anbietermodelle zum Erweitern vorhandener LINQLINQ-Technologien, wie LINQ to SQLLINQ to SQL, auf andere Datenquellentypen in Visual Studio 2008Visual Studio 2008 zur Verfügung.No provider models for extending existing LINQLINQ technologies, such as LINQ to SQLLINQ to SQL, to other types of data source are available in Visual Studio 2008Visual Studio 2008.

LINQ-Anbieter "IQueryable"IQueryable LINQ Providers

LINQLINQ-Anbieter, die IQueryable<T> implementieren, können in ihrer Komplexität große Unterschiede aufweisen. providers that implement IQueryable<T> can vary widely in their complexity. In diesem Abschnitt werden die verschiedenen Komplexitätsstufen erläutert.This section discusses the different levels of complexity.

Ein weniger komplexer IQueryable-Anbieter erstellt möglicherweise eine Schnittstelle mit einer einzelnen Methode eines Webdiensts.A less complex IQueryable provider might interface with a single method of a Web service. Dieser Anbietertyp ist sehr spezifisch, da er erwartet, dass in den von ihm verarbeiteten Abfragen bestimmte Informationen enthalten sind.This type of provider is very specific because it expects specific information in the queries that it handles. Er verfügt über ein geschlossenes Typsystem und macht möglicherweise nur einen einzelnen Ergebnistyp verfügbar.It has a closed type system, perhaps exposing a single result type. Ein Großteil der Abfrageverarbeitung erfolgt lokal, beispielsweise unter Verwendung der Enumerable-Implementierungen der Standardabfrageoperatoren.Most of the execution of the query occurs locally, for example by using the Enumerable implementations of the standard query operators. Ein weniger komplexer Anbieter überprüft u. U. nur einen Ausdruck des Methodenaufrufs in der Ausdrucksbaumstruktur, die die Abfrage darstellt, und lässt die übrige Abfragelogik von einer anderen Instanz behandeln.A less complex provider might examine only one method call expression in the expression tree that represents the query, and let the remaining logic of the query be handled elsewhere.

Ein IQueryable-Anbieter mittlerer Komplexität verwendet möglicherweise eine Datenquelle als Ziel, die über eine teilweise ausdrucksbasierte Abfragesprache verfügt.An IQueryable provider of medium complexity might target a data source that has a partially expressive query language. Wenn ein Webdienst als Ziel verwendet wird, stellt der Anbieter vielleicht Verbindungen zu mehr als einer Webdienstmethode her und wählt die aufzurufende Methode auf der Grundlage der Frage aus, die von der Abfrage gestellt wird.If it targets a Web service, it might interface with more than one method of the Web service and select the method to call based on the question that the query poses. Ein Anbieter mittlerer Komplexität verfügt über ein umfangreicheres Typsystem als ein einfacher Anbieter, das jedoch weiterhin ein festes Typsystem darstellt.A provider of medium complexity would have a richer type system than a simple provider, but it would still be a fixed type system. Der Anbieter kann beispielsweise Typen verfügbar machen, die über 1:n-Beziehungen verfügen, die wiederum traversiert werden können, ohne eine Zuordnungstechnologie für benutzerdefinierte Typen bereitzustellen.For example, the provider might expose types that have one-to-many relationships that can be traversed, but it would not provide mapping technology for user-defined types.

Ein komplexer IQueryable-Anbieter, wie z. B. der LINQ to SQLLINQ to SQL-Anbieter, kann möglicherweise vollständige LINQLINQ-Abfragen in eine ausdrucksbasierte Abfragesprache wie SQL übersetzen.A complex IQueryable provider, such as the LINQ to SQLLINQ to SQL provider, might translate complete LINQLINQ queries to an expressive query language, such as SQL. Ein komplexer Anbieter arbeitet universeller als ein weniger komplexer Anbieter, da er eine größere Bandbreite von Fragen in der Abfrage verarbeiten kann.A complex provider is more general than a less complex provider, because it can handle a wider variety of questions in the query. Außerdem verfügt er über ein offenes Typsystem und benötigt daher eine umfassende Infrastruktur für die Zuordnung benutzerdefinierter Typen.It also has an open type system and therefore must contain extensive infrastructure to map user-defined types. Die Entwicklung eines komplexen Anbieters ist ziemlich arbeitsaufwändig.Developing a complex provider requires a significant amount of effort.

Siehe auchSee Also

IQueryable<T>
IEnumerable<T>
Enumerable
Standard Query Operators Overview (C#) (Übersicht der Standardabfrageoperatoren (C#))Standard Query Operators Overview (C#)
LINQ to Objects (C#)LINQ to Objects (C#)