2010-06-22 3 views
11

ich die folgende Erklärung mit dem Northwind.sdf in LinqPad erfolgreich ausgeführt wird:Gibt es eine allgemeine Methode, um zu überprüfen, ob eine Property-Definition von einem Linq-Provider unterstützt wird, insbesondere OData?

from s in Shippers 
    select new 
{ 
    s.ShipperID, 
    s.CompanyName,  
    Count=s.ShipViaOrders.Count()  
} 

Zur gleichen Zeit, ich konnte eine ähnliche Aussage mit dem OData Service (http://services.odata.org/northwind/northwind.svc) in LinqPad auszuführen:

from s in Shippers  
select new 
{ 
    s.ShipperID, 
    s.CompanyName,  
    Count=s.Orders.Count()  
} 

Der Fehler ist "Erstellen oder Initialisieren Instanzen des Typs <> f__AnonymousType0`3 [System.Int32, System.String, System.Int32] mit dem Ausdruck s.Orders.Count() wird nicht unterstützt.".

Ich weiß, OData-Service ist in Linq Support sehr begrenzt. Ich habe eine dynamische Linq-Anweisung in meiner Anwendung. Eigentlich versuche ich die Datenquelle von Compact SQL Server zum OData-Service zu migrieren.

Also muss ich NotSupportedException in einer allgemeinen Weise behandeln. Derzeit versuche ich die Syntax der zu überprüfenden Eigenschaft definieren, bevor es, wie

"s.Orders.Count() as Count" 

Es ging meinen Scheck laufen, aber es traf NotSupportedException von OData.

Gibt es eine Möglichkeit zu überprüfen, ob eine Eigenschaft (durch eine Zeichenfolge oder ein Lambda) von einem Linq-Provider unterstützt wird?

Alle Vorschläge sind willkommen.

Ying

Antwort

6

Leider gibt es keine allgemeine programmatische Art und Weise, ob der Überprüfung ein LINQ Provider in der Lage sein wird, jede beliebige Abfrage zu übersetzen. In der Regel müssen Sie auf die Dokumentation zurückgreifen oder (wie Sie sicher sind) die Abfragen tatsächlich ausprobieren.

Verschiedene Anbieter können jedoch einen Mechanismus zum Generieren einer Repräsentation für die Abfrage bereitstellen, mit dem Sie möglicherweise überprüfen können, ob die Abfrage funktionieren würde, ohne sie ausführen zu müssen.

Im OData-Clientfall können Sie .ToString() für die Abfrage aufrufen und eine URL zurückgeben, wenn sie die Abfrage erfolgreich verarbeiten kann. Andernfalls wird eine Fehlermeldung angezeigt, die ähnlich aussieht wie "Fehler beim Übersetzen von Linq-Ausdruck in URI: ..." (die tatsächliche Fehlermeldung kann sich je nach Benutzersprache ändern, aber ist definitiv kein gültiger URI).

+0

@Ying: Das klingt wie * die * Antwort auf mich. Wenn ja, möchten Sie es vielleicht akzeptieren. – chiccodoro

2

Die einzige Möglichkeit, dies herauszufinden, ist das Testen einer bestimmten Abfrage oder über die Dokumentation, wenn der Ersteller des LINQ-Anbieters eine detaillierte Liste der nicht unterstützten Funktionen bereitgestellt hat.

LINQ selbst hat eine sehr lockere Spezifikation, die weitgehend durch die auf IQueryable/IEnumerable definierten Erweiterungsmethoden definiert ist. Die Implementierung eines LINQ-Anbieters bedeutet, dass Sie eine Übersetzung über die Datenquelle implementieren müssen - z. LINQ to SQL übersetzt die in einer LINQ-Abfrage ausgedrückte Ausdrucksbaumstruktur in SQL, die von einem Datenbankanbieter verstanden wird. Jede Datenquelle hat ihre eigenen Beschränkungen, die letztlich bestimmen, was unterstützt werden kann, und ebenso kann jeder LINQ-Anbieter auswählen, eine bestimmte Methode oder ein bestimmtes Verhalten zu implementieren (oder nicht zu implementieren).

Es kann der Fall sein, dass dies nur eine Einschränkung des Providers innerhalb von LINQPad für den Umgang mit OData darstellt - Sie können stattdessen OQuery auschecken und sehen, ob dies für Sie eine bessere Funktionalität bietet - schauen Sie sich an http://beta.code.msdn.microsoft.com/OQuery-Building-OData-d2e75eed für die Details und einen Download.

Verwandte Themen