2010-06-22 15 views
11

Ho eseguito correttamente la seguente dichiarazione con la Northwind.sdf in LINQPad:Esiste un metodo generale per verificare se una proprietà definita è supportata da un provider Linq, in particolare OData?

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

Allo stesso tempo, non sono riuscito ad eseguire un'istruzione simile con il Servizio odata (http://services.odata.org/northwind/northwind.svc) in LINQPad:

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

L'errore è "Costruire o inizializzare istanze del tipo <> f__AnonymousType0`3 [System.Int32, System.String, System.Int32] con l'espressione s.Orders.Count() non è supportato.".

So che il servizio OData è molto limitato nel supporto Linq. Ho un supporto di istruzioni Linq dinamico nella mia applicazione. In realtà sto cercando di migrare l'origine dati da Compact SQL Server al servizio OData.

Quindi mi devo occupare di NotSupportedException in generale. Allo stato attuale, cerco di controllare la sintassi della proprietà definiscono prima di eseguirlo, come ad esempio

"s.Orders.Count() as Count" 

Passò il mio assegno, ma ha soddisfatto NotSupportedException di OData.

C'è un modo per verificare se una proprietà definisce (tramite una stringa o lambda) è supportata da un provider Linq?

Qualsiasi suggerimento è gradito.

Ying

risposta

6

Purtroppo non c'è modo programmatico generale di verificare se un fornitore di LINQ sarà in grado di tradurre una determinata query. In genere dovrai ricorrere alla documentazione o (per essere sicuro) provare effettivamente le query come stai facendo.

Diversi provider possono tuttavia fornire alcuni meccanismi per generare una rappresentazione per la query, che potrebbe essere in grado di utilizzare per verificare se la query funzionerebbe senza doverla eseguire.

Nel caso del client OData, è possibile richiamare .ToString() sulla query e restituire un URL se è in grado di elaborare correttamente la query; in caso contrario restituirà un messaggio di errore simile a "Errore di traduzione dell'espressione Linq in URI: ..." (il messaggio di errore effettivo potrebbe cambiare in base alla lingua dell'utente, ma sarà sicuramente non un URI valido).

+0

@Ying: Questo suona come * la * risposta a me. Se è così, puoi accettarlo. – chiccodoro

2

Sfortunatamente l'unico modo per scoprirlo è testare una query specifica o tramite documentazione se il creatore del provider LINQ ha fornito un elenco dettagliato di ciò che non è supportato.

LINQ stesso ha una specifica molto ampia ampiamente definita dai metodi di estensione definiti su IQueryable/IEnumerable. Implementare un provider LINQ significa che devi implementare una traduzione sull'origine dati, ad es. LINQ to SQL converte l'albero delle espressioni espresso in una query LINQ in SQL che è compreso da un provider di database. Ogni fonte di dati ha le proprie limitazioni che in definitiva regolano ciò che può essere supportato, e allo stesso modo ogni provider LINQ può scegliere di implementare (o non implementare) un particolare metodo o comportamento.

Può essere il caso che questa è solo una limitazione del provider all'interno LINQPad per trattare con OData - si potrebbe desiderare di controllare OQuery invece e vedere se questo fornisce una migliore set di funzionalità per voi - dare un'occhiata a http://beta.code.msdn.microsoft.com/OQuery-Building-OData-d2e75eed per i dettagli e un download.

Problemi correlati