我试图弄清楚如何完成相当于:
select *
from Users u
inner join Comments c on c.UserId = u.Id
where Id = 1569
(表别名以获得更好的 SQL 可读性)
...在 StackOverflow OData 端点上。这个 url 将如何构造?我正在查看文档Expand http://www.odata.org/developers/protocols/uri-conventions#ExpandSystemQueryOption在 OData.org 上,我本以为它看起来像这样:
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 并在一次调用中完成此操作?
正确的方法是这样的:
http://odata.stackexchange.com/stackoverflow/atom/Users(1569)?$expand=Comments
问题是数据源中似乎没有用户(不知道为什么),因此上面的查询将返回 404。但这是正确的语法。
这个想法是,如果您只需要有关一个用户的信息,您可以使用/Users(1569)
(括号中的内容是实体集的主键)。然后,如果您还想包含所有评论,只需添加$expand=Comments
。如果您只想要评论而不想要有关用户的信息,您可以这样做/Users(1569)/Comments
.
请注意,您使用的服务没有定义导航属性,因此上述内容将不起作用,因为实际上不支持“连接”。但 stackexchange odata 端点确实定义了导航属性。
基本上,连接是在服务器/服务上定义的,以便客户端不必知道哪列是哪个主键的外键。
它还有助于不使用关系数据库作为存储的数据源,因为它不会强迫它们创建假外键。
您可以进一步向下展开图表的“层”。如果展开中返回的实体还定义了更多导航属性,则您可以指定以逗号分隔的导航属性列表。
这是一个虚构服务的示例,请注意,这是扩展集合中的每个客户,这类似于多重联接。
.../Customers?$expand=Orders,OrderDetails
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)