2012-06-28 17 views
5

Uso LINQPad per connettersi ai servizi ODATA su un'organizzazione CRM locale e non so come eseguire "join" o per attraversare relazioni utilizzando LINQPad.Espansione di ODATA in LinqPad

Ecco il mio URL

OrganizationData.svc/New_locationSet?$select=new_state_new_location/new_Region$expand=new_state_new_location 

che funziona bene nel browser. Ecco quello che sto facendo in LINQPad:

from l in new_locationSet 
from s in l.new_state_new_location 
select s.new_Region 

ma sto ottenendo un errore:

An expression of type 'LINQPad.User.New_state' is not allowed in a subsequent from clause in a query expression with source type 'System.Data.Services.Client.DataServiceQuery<LINQPad.User.New_location>'. Type inference failed in the call to 'SelectMany'. 

Tutte le idee? Ho trovato la documentazione LINQPad OData estremamente carente ...

risposta

7

Hai solo bisogno di proiettare ciò che si desidera espandere, ad esempio:

from p in Products 
select new {p.Name, CategoryName = p.Category.Name} 

o

Products.Select(p => new { p.Name, CategoryName = p.Category.Name}) 

sarà resa

http://services.odata.org/(S(readwrite))/OData/OData.svc/Products()?$expand=Category&$select=Name,Category/Name 

nella scheda Registro richieste di LinqPad.

+0

Quindi, dal momento che Odata ha un singolo set di dati da cui funziona (ovvero non puoi fare Odata.svc/Products() Categories()? ...), devi strutturare la query LINQ con un singolo "da" set di dati e mettere la partecipazione nella selezione come una proiezione? E siccome l'odata ha già definito tutte le relazioni, lo collegherà automaticamente? – Daryl

+1

Sì, è proprio vero. Nell'URL non ci sono join (dato che non sono necessari dato che ci sono proprietà di navigazione), il LINQ lato client al traduttore URL cerca di essere molto intelligente su queste cose e potrebbe riconoscere alcuni join come navigazioni, ma attualmente è molto limitato (soprattutto perché non conosce o ha le chiavi esterne). Un'immagine utile da usare è immaginare OData come un grafico di oggetti e la query definisce un albero in quel grafico che si desidera restituire. Questo è molto diverso dai database relazionali in cui sono presenti tabelle e la query definisce una matrice. –