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)
| 归档时间: |
|
| 查看次数: |
26846 次 |
| 最近记录: |