2012-06-28 16 views
5

Estoy usando LINQPad para conectarme a los servicios ODATA en una organización local de CRM y no sé cómo realizar "uniones" o recorrer relaciones usando LINQPad.Cómo realizar una expansión ODATA en LinqPad

Aquí es mi URL

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

que funciona muy bien en el navegador. Aquí es lo que estoy haciendo en LINQPad:

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

pero estoy recibiendo un error:

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

¿Alguna idea? He encontrado la documentación LINQPad OData extremadamente carente ...

Respuesta

7

sólo tiene que proyectar lo que desea ampliar, por ejemplo:

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

o

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

rendirá

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

en la pestaña Registro de solicitud de LinqPad.

+0

Básicamente, dado que odata tiene un único conjunto de datos del que funciona (es decir, no puede hacer Odata.svc/Products() Categories()? ...), debe estructurar su consulta LINQ con un único "de" conjunto de datos y poner la unión en la selección como una proyección? Y dado que odata ya tiene definidas todas las relaciones, ¿lo conectará automáticamente? – Daryl

+1

Sí, eso está muy bien. En la URL no hay uniones (ya que no son necesarias dado que hay propiedades de navegación), el traductor LINQ to URL del lado del cliente trata de ser muy inteligente sobre estas cosas y puede reconocer algunas uniones como navegaciones, pero actualmente es muy limitado (principalmente porque no sabe o tiene claves foráneas). Una imagen útil para usar es imaginar OData como un gráfico de objetos y la consulta define un árbol en ese gráfico que desea devolver. Eso es muy diferente de las bases de datos relacionales donde tiene tablas y la consulta define una matriz. –