小编典典

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

sql

我试图弄清楚如何完成以下工作:

select *
from Users u
inner join Comments c on c.UserId = u.Id
where Id = 1569

(表别名可提高SQL的可读性)

…在StackOverflow
OData端点上。该网址将如何构造?我正在OData.org上查看Expand的文档,我会认为它看起来像:

https://odata.sqlazurelabs.com/OData.svc/v0.1/rp1uiewita/codingdict/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并在一次调用中完成?


阅读 232

收藏
2021-04-15

共1个答案

小编典典

正确的方法是:

http://odata.stackexchange.com/codingdict/atom/Users(1569)?$expand=Comments

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

这个想法是,如果您只想获得有关一个​​用户的信息,则可以通过使用来“导航” /Users(1569)
(括号中的内容是实体集的主键)。然后,如果您还想包含所有注释,只需添加$expand=Comments。如果您只需要注释而不是有关用户的信息,则可以执行此操作/Users(1569)/Comments

请注意,您使用的服务未定义导航属性,因此上述内容将无法正常使用,因为“连接”实际上不受支持。但是stackexchange
odata端点确实定义了导航属性。

基本上,联接是在服务器/服务上定义的,因此客户端不必知道哪个列是哪个主键的外键。

它还对不使用关系数据库作为存储的数据源有所帮助,因为它不会强迫它们创建伪外键。

您可以扩展图的其他“层”。如果在扩展中返回的实体还定义了其他导航属性,则可以指定以逗号分隔的导航属性列表。

这是一个组合服务的示例,请注意,这正在扩展集合中的每个客户,这类似于多重联接。

.../Customers?$expand=Orders,OrderDetails
2021-04-15