如何像使用SQL连接一样使用OData Expand?

Fac*_*tic 24 sql stack-overflow odata

我正在试图找出如何完成相当于:

select *
from Users u
inner join Comments c on c.UserId = u.Id
where Id = 1569
Run Code Online (Sandbox Code Playgroud)

(表别名以获得更好的sql可读性)

...在StackOverflow OData端点上.这个网址将如何构建?我正在看OData.org上的Expand文档,我认为它看起来像:

https://odata.sqlazurelabs.com/OData.svc/v0.1/rp1uiewita/StackOverflow/Users?$Expand=Comments&$filter=UserId eq 1569 但是不对.

在Linq中,它就是这个(我想),但不支持Join:

Users.Where(u=>u.Id==1569).Join(Comments, u=>u.Id, c=>c.UserId, (a,b)=>a.Id==b.UserId)

我不需要在Linq中严格解决这个问题,我只是想弄清楚如何构造查询URL.基本上,我如何将SQL连接谓词转换为OData URL并在一次调用中执行此操作?

Vit*_*SFT 17

正确的方法是这样的:

http://odata.stackexchange.com/stackoverflow/atom/Users(1569)?$expand=Comments
Run Code Online (Sandbox Code Playgroud)

问题是数据源中似乎没有用户(不知道为什么),因此上面的查询将返回404.但它是正确的语法.

这个想法是,如果你想要只有一个用户的信息,你可以通过使用/Users(1569) ("parethesis中的东西是实体集的主键"来"导航"它.然后,如果您还想要包含所有注释,只需添加即可$expand=Comments.如果您只想要评论而不是您可以做的有关用户的信息/Users(1569)/Comments.

请注意,您使用的服务未定义导航属性,因此上述操作无效,因为实际上不支持"连接".但是stackexchange odata端点确实定义了导航属性.

基本上,连接是在服务器/服务上定义的,这样客户端就不必知道哪个列是哪个主键的外键.

它还有助于不使用关系数据库作为其存储的数据源,因为它不会强制它们创建虚假的外键.

您可以向下扩展图表的"层".如果在展开中返回的实体还定义了更多导航属性,则可以指定以逗号分隔的导航属性列表.

这是一个虚构服务的示例,请注意,这会扩展集合中的每个客户,这类似于多个联接.

.../Customers?$expand=Orders,OrderDetails
Run Code Online (Sandbox Code Playgroud)

  • 在OData中,没有像SQL服务器那样的"连接".关系表示为所谓的"导航"属性.基本上属性值为一个或多个实体(或指向这些实体的链接).所以,是的,如果数据由SQL表支持,则需要在服务器上定义完全连接.我更新了上面的回复,注意样本模型中没有导航属性,但是stackexchange上的那个实际上确实有那些. (2认同)