2011-01-11 8 views
3

Ich muss einen WCF-Dienst erstellen, um Objekte zurückzugeben, die von einer Datenbank über Entity Framework abgefragt werden. Die meisten Artikel, die ich gelesen habe, schlagen vor, dass ich eine Methode für jeden Abfragetyp erstellen sollte. Aber ich denke, das wird eine Explosion in der Anzahl der Methoden führen werde ich zum Beispiel erstellen:Entity Framework 4 LINQ zu Entitäten Abfragen über WCF

  • GetAllCars()
  • GetCarsByBrand (string herstellername)
  • GetCarsByYear (int Jahr)
  • GetCarsByBrandAndYear (String Markenname, int Jahr)
  • GetCarsByTireSize (float tireSize)
  • GetCarsByEngineType (string Motortyp)
  • GetCarsByEngineSizeAnd Typ (float engineSize, string Motortyp)
  • GetCarsByEngineSizeBetween (float lowerEngineSize, float upperEngineSize)
  • etc ..

Hinzu kommt, dass, wenn eine neue Abfrage erforderlich ist, dann muss ich eine erstellen neue Methode, um es zu unterstützen.

Es muss eine bessere generische Möglichkeit geben, dies zu tun. Ideal wäre es, wenn der Client einen Ausdrucksbaum über LINQ erstellen, über WCF senden und die Abfrage dann über das Entitätsframework ausführen kann. Dann kann ich eine Methode haben, um alle Anfragen zu unterstützen. Zum Beispiel:

  • QueryCars (Expression Ausdruck)

oder einen Ausdruck als String senden:

  • QueryCars (String-Ausdruck)

Wie haben die Entwickler gelöst diese Problem der flexiblen Abfrage?

Ich arbeite derzeit in .NET 4.0. Sicherheit ist nicht wirklich ein Problem, da dies nur eine interne App ist.

Antwort

3

Was Sie suchen, ist WCF Data Services. Es verwendet das OData-Protokoll, um die Daten mit Linq abzufragen.

Beispiel mit den Stack Overflow OData service:

var query = from u in service.Users 
      orderby u.Reputation descending 
      select u; 

Console.WriteLine ("Top ten Stack Overflow users"); 
foreach (var u in query.Take(10)) 
{ 
    Console.WriteLine ("{0}: {1}", u.DisplayName, u.Reputation); 
} 

In dem obigen Code ist service.Users vom Typ IQueryable<User>, die Sie es mit einem Ausdruck Baum abfragen können.

Sie können den SO-Dienst problemlos mit LINQPad testen oder indem Sie in einem VS-Projekt einen Verweis auf die Service-URL hinzufügen.

+0

Das sieht wie die Antwort aus, die ich suche. Aus Neugier, wie wäre dieses Problem vor WCF Data Services gelöst worden? – Mas

+0

Nachdem ich etwas darüber gelesen habe, bin ich mir nicht sicher, ob dies auch das Lazy Loading unterstützen würde.Weißt du, ob das automatische Laden automatisch ausgeführt wird? – Mas

+0

@Mas: Bevor es hieß, hieß es ADO.NET Data Services oder Astoria und bevor es Linq nicht existiert;) –

3

Mit Ihrer Beschreibung benötigen Sie keine reinen WCF-Dienste, sondern WCF Data Services. Datendienst erlauben Sie exposing IQueryable und definieren Sie die Linq-Abfrage auf dem Client.

Verwandte Themen