我试图弄清楚如何完成以下工作:
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 但这是不对的。
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并在一次调用中完成?
正确的方法是:
http://odata.stackexchange.com/codingdict/atom/Users(1569)?$expand=Comments
问题在于数据源中似乎没有用户(不知道为什么),因此上述查询将返回404。但这是正确的语法。
这个想法是,如果您只想获得有关一个用户的信息,则可以通过使用来“导航” /Users(1569) (括号中的内容是实体集的主键)。然后,如果您还想包含所有注释,只需添加$expand=Comments。如果您只需要注释而不是有关用户的信息,则可以执行此操作/Users(1569)/Comments。
/Users(1569)
$expand=Comments
/Users(1569)/Comments
请注意,您使用的服务未定义导航属性,因此上述内容将无法正常使用,因为“连接”实际上不受支持。但是stackexchange odata端点确实定义了导航属性。
基本上,联接是在服务器/服务上定义的,因此客户端不必知道哪个列是哪个主键的外键。
它还对不使用关系数据库作为存储的数据源有所帮助,因为它不会强迫它们创建伪外键。
您可以扩展图的其他“层”。如果在扩展中返回的实体还定义了其他导航属性,则可以指定以逗号分隔的导航属性列表。
这是一个组合服务的示例,请注意,这正在扩展集合中的每个客户,这类似于多重联接。
.../Customers?$expand=Orders,OrderDetails