如何在LinqPad中执行ODATA扩展

6

我正在使用LINQPad连接本地CRM组织上的ODATA服务,但我不知道如何使用LINQPad执行“联接”操作或遍历关系。

这是我的URL:

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

在浏览器中运行良好。这是我在LINQPad中所做的:
from l in new_locationSet
from s in l.new_state_new_location
select s.new_Region

但是我遇到了一个错误:
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'.

有任何想法吗?我发现LINQPad OData文档极其匮乏...
1个回答

7

您只需要投影出您想要扩展的内容,例如:

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

或者

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

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

在 LinqPad 的“请求日志”选项卡中。

基本上,由于OData只有一个数据集(即您无法执行Odata.svc/Products()Categories()之类的操作),因此您必须使用单个“from”数据集构建LINQ查询,并将连接作为投影放入选择中。而且,由于OData已经定义了所有关系,因此它会自动连接起来。 - Daryl
1
是的 - 那基本上是正确的。在URL中没有连接(因为由于有导航属性,它们不需要),客户端LINQ到URL转换器会尝试在这些事情上非常聪明,并且可能将一些连接识别为导航,但目前它非常有限(主要是因为它不知道或没有外键)。一个有用的图片是将OData想象成对象图形,而查询定义了您要返回的该图形中的树。这与关系数据库非常不同,其中您具有表格,而查询定义了矩阵。 - Vitek Karas MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接