Sdílet prostřednictvím


Beispiel eines LINQ to TerraServer-Anbieters

Aktualisiert: November 2007

Dieses Beispiel ist ein benutzerdefinierter LINQ-Anbieter für den TerraServer-USA-Webdienst. Es enthält außerdem eine Beispielclientanwendung, die mithilfe des benutzerdefinierten LINQ-Anbieters geografische Daten vom Webdienst abfragt.

Der TerraServer-USA-Webdienst macht eine Methode verfügbar, die Informationen zu Orten in den USA zurückgibt, wenn der Methode die Adressdaten teilweise oder vollständig zur Verfügung gestellt werden. Die Methode trägt die Bezeichnung GetPlaceList und wird vom LINQ-Anbieter aufgerufen, um die Daten abzurufen, für die die LINQ-Abfrage ausgeführt wird. Der Anbieter verwendet Windows Communication Foundation (WCF) zur Kommunikation mit dem Webdienst. Weitere Informationen über den TerraServer-USA-Webdienst finden Sie unter Overview of the TerraServer-USA Web Services.

Ein LINQ-Anbieter, der die diesem Beispiel entsprechende IQueryable<T>-Schnittstelle implementiert, ermöglicht das Schreiben von LINQ-Abfragen für die Datenquelle, mit der der Anbieter verbunden ist. Ein Anbieter kann die Abfragefunktionen direkt für die Daten ausführen oder die LINQ-Abfrage in eine Abfragesprache übersetzen, die für die Datenquelle, zu der eine Verbindung hergestellt wird, geeignet ist. Dieser Anbieter ruft Daten vom Webdienst ab und bearbeitet die ursprüngliche Abfrage, sodass LINQ to Objects die Abfrageausführung behandelt.

Sicherheitshinweis:

Dieser Beispielcode soll lediglich ein Konzept veranschaulichen. Es wird nur der für das jeweilige Konzept relevante Code dargestellt. Möglicherweise erfüllt dieser nicht die Sicherheitsanforderungen für eine bestimmte Umgebung, und er sollte nicht genau wie dargestellt verwendet werden. Wir empfehlen, Sicherheits- und Fehlerbehandlungscode hinzuzufügen, um Ihre Projekte sicherer und stabiler zu machen. Microsoft stellt diesen Beispielcode "wie besehen" und ohne Garantien zur Verfügung.

So rufen Sie Beispiele und Anweisungen für ihre Installation ab

  • Führen Sie eine oder mehrere der folgenden Aktionen aus:

    • Klicken Sie im Menü Hilfe auf Beispiele.

      In der Infodatei werden Informationen zu Beispielen angezeigt.

    • Rufen Sie die Website Visual Studio 2008 Samples auf. Dort ist die aktuelle Version der Beispiele verfügbar.

Weitere Informationen finden Sie unter Suchen von Beispieldateien.

Hinweis:

Das Beispiel steht nur online zur Verfügung.

So führen Sie die Clientanwendung in Visual Studio aus

  1. Öffnen Sie die Datei LinqToTerraServerProvider.sln in Visual Studio.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt LinqToTerraServerProvider, und klicken Sie dann auf Erstellen.

  3. Klicken Sie im Menü Debuggen auf Starten ohne Debuggen.

Anforderungen

Zum Ausführen dieses Beispiels benötigen Sie die folgenden Komponenten:

  • Visual Studio 2008

Veranschaulicht

In diesem Beispiel wird veranschaulicht, wie IQueryable<T>, IOrderedQueryable<T> und IQueryProvider implementiert werden.

Entwurfsentscheidungen

In der folgenden Tabelle werden die Dateien im LinqToTerraServerProvider-Projekt aufgeführt.

Datei

Beschreibung

Evaluator.cs

Wertet die Ausdrucksbaumstruktur der Abfrage teilweise aus. Dadurch werden alle lokalen Variablenverweise in der LINQ-Abfrage in Werte übersetzt.

ExpressionTreeHelpers.cs

Enthält Methoden, mit deren Hilfe Informationen über bestimmte Typen von Ausdrucksbaumstrukturen ermittelt und Daten aus bestimmten Typen von Ausdrucksbaumstrukturen extrahiert werden können.

ExpressionTreeModifier.cs

Eine Besucherunterklasse für die Ausdrucksbaumstruktur, durch die die Ausdrucksbaumstruktur geändert wird, die die gesamte LINQ-Abfrage darstellt.

ExpressionVisitor.cs

Die Besucherbasisklasse der Ausdrucksbaumstruktur.

InnermostWhereFinder.cs

Eine Besucherunterklasse für die Ausdrucksbaumstruktur, durch die der Ausdruck in der Ausdrucksbaumstruktur der Abfrage ermittelt wird, der den innersten Aufruf der Where-Methode darstellt. Dieser innerste Ausdruck ist der Ausdruck, aus dem der Anbieter die gesuchten Standorte extrahiert.

InvalidQueryException.cs

Definiert eine Ausnahme, die ausgelöst wird, wenn eine ungültige Abfrage gesendet wird.

LocationFinder.cs

Eine Besucherunterklasse für die Ausdrucksbaumstruktur, durch die Positionsinformationen aus der LINQ-Abfrage extrahiert werden, die in der Webdienstanforderung verwendet werden sollen. Diese Klasse versteht Speicherortinformationen, die in einem der folgenden Formate zur Verfügung gestellt werden:

  • Ein Gleichheitsausdruck, z. B. place.Name == "Seattle".

  • Ein Ausdruck des Methodenaufrufs für die Methode StartsWith, z. B. place.Name.StartsWith("Seat").

  • Ein Ausdruck des Methodenaufrufs für die Enumerable.Contains-Methode und die List<T>.Contains-Methode, z. B. placeList.Contains(place.Name).

Place.cs

Definiert einen benutzerdefinierten .NET-Typ, um die Daten aus dem Webdienst darzustellen.

QueryableTerraServerData.cs

Enthält den Typ, für den die Clientabfrage Abfragen definiert. Dieser Typ implementiert IOrderedQueryable<T>, um Sortiervorgänge in der Abfrage zu unterstützen. IOrderedQueryable<T> wird von IQueryable<T> abgeleitet. Daher wird durch Implementieren von IOrderedQueryable<T> auch IQueryable<T> durch diesen Typ implementiert.

TerraServerQueryContext.cs

Enthält eine Klasse, die die Aufgaben zum Ausführen einer Abfrage organisiert.

TerraServerQueryProvider.cs

Enthält den Typ, der die IQueryProvider-Schnittstelle implementiert. Die von dieser Schnittstelle definierten Methoden werden für das Ausführen der Abfrage von den Methoden des Standardabfrageoperators abgerufen, die in Queryable definiert werden.

TypeSystem.cs

Diese Hilfsklasse implementiert eine Methode, mit der der Elementtyp der generischen Auflistung, die die Abfrageergebnisse enthält, bereitgestellt wird.

WebServiceHelper.cs

Ruft Daten vom Webdienst ab. Dieser Code enthält zwei Überprüfungen, die die Verwendbarkeit der Anbieterbibliothek verbessern. Durch die erste Überprüfung wird die maximale Dauer beschränkt, die eine Clientanwendung auf eine Antwort wartet, indem die Gesamtanzahl der pro Abfrage an den Webdienst gesendeten Aufrufe auf fünf Aufrufe begrenzt wird. Mit der zweiten Überprüfung wird festgestellt, ob die Anzahl der vom Webdienst zurückgegebenen Ergebnisse der maximalen Anzahl von Ergebnissen entspricht, die der Dienst zurückgeben kann. Wenn die Anzahl der Ergebnisse der maximalen Anzahl entspricht, besteht die Wahrscheinlichkeit, dass die Ergebnisse des Webdiensts abgeschnitten sind. Statt eine unvollständige Liste an den Client zurückzugeben, löst der Anbieter eine Ausnahme aus.

In der folgenden Tabelle werden die Dateien im ClientApp-Projekt aufgeführt.

Datei

Beschreibung

Program.cs

Enthält drei Beispiele für LINQ-Abfragen, die den QueryableTerraServerData-Typ abfragen, der im LinqToTerraServerProvider-Projekt definiert wurde.

app.config

Enthält einen Endpunkt, der die Kommunikation der Anwendung mit dem Webdienst definiert.

Weitere Informationen zum Entwurf dieses benutzerdefinierten LINQ-Anbieters finden Sie unter Exemplarische Vorgehensweise: Erstellen eines IQueryable-LINQ-Anbieters.

Siehe auch

Aufgaben

Gewusst wie: Implementieren eines Ausdrucksbaumstruktur-Besuchers

Weitere Ressourcen

Beispiele zu LINQ C#