2012-06-28 8 views
5

Ich verwende LINQPad, um eine Verbindung zu den ODATA-Diensten in einer lokalen CRM-Organisation herzustellen, und ich weiß nicht, wie Verknüpfungen mit LINQPad ausgeführt werden.So führen Sie eine ODATA-Erweiterung in LinqPad aus

Hier ist meine URL

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

, die im Browser funktioniert gut. Hier ist, was ich tue in LINQPad:

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

aber ich erhalte eine Fehlermeldung:

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'. 

Irgendwelche Ideen? Ich habe die LINQPad OData Dokumentation extrem fehlen gefunden ...

Antwort

7

Sie müssen nur herausragen, was Sie erweitern möchten, zB:

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

oder

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

nachgeben

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

in LinqPad Anforderungsprotokoll Registerkarte.

+0

Also im Grunde, da odata einen einzelnen Datensatz hat, von dem es funktioniert (dh Sie können nicht Odata.svc/Products() Categories()? ...), müssen Sie Ihre LINQ-Abfrage mit einem einzigen Struktur "from" -Datensatz und den Beitritt in die Auswahl als Projektion setzen? Und da odata bereits alle Beziehungen definiert hat, wird es automatisch verdrahtet? – Daryl

+1

Ja - das ist ziemlich richtig. Da in der URL keine Joins vorhanden sind (da sie aufgrund der Navigationseigenschaften nicht benötigt werden), versucht der LINQ to URL-Übersetzer auf der Clientseite sehr clever zu sein und kann einige Joins als Navigation erkennen, aber momentan ist es sehr begrenzt (hauptsächlich weil es keine Fremdschlüssel kennt oder hat). Ein hilfreiches Bild, das Sie verwenden können, ist, sich OData als ein Diagramm von Objekten vorzustellen, und die Abfrage definiert einen Baum in diesem Diagramm, den Sie zurückgeben möchten. Das ist ganz anders als bei relationalen Datenbanken, wo Sie Tabellen haben und die Abfrage eine Matrix definiert. –