我正在试图弄清楚如何完成相同的:
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/StackOverflow/Users?$Expand=Comments&$filter=UserId eq 1569
但是不对。
在Linq中,就是这个(我想),但不支持加入:
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并在一次调用中执行此操作?
答案 0 :(得分:15)
这样做的正确方法是:
http://odata.stackexchange.com/stackoverflow/atom/Users(1569)?$expand=Comments
问题是数据源中似乎没有用户(不知道为什么),因此上面的查询将返回404.但它是正确的语法。
我们的想法是,如果您只想了解一个用户的信息,可以使用/Users(1569)
“导航”它(parethesis中的东西是实体集的主键)。然后,如果您还想包含所有评论,只需添加$expand=Comments
即可。如果您只想要评论而不是用户信息,可以/Users(1569)/Comments
。
请注意,您使用的服务未定义导航属性,因此上述操作不起作用,因为实际上不支持“连接”。但是stackexchange odata端点确实定义了导航属性。
基本上,连接是在服务器/服务上定义的,这样客户端就不必知道哪个列是哪个主键的外键。
它还有助于不使用关系数据库作为其存储的数据源,因为它不会强制它们创建伪造的外键。
您可以进一步展开图表的“图层”。如果在展开中返回的实体还定义了更多导航属性,则可以指定以逗号分隔的导航属性列表。
以下是制作服务的示例,请注意,这会扩展集合中的每个客户,这类似于多重连接。
.../Customers?$expand=Orders,OrderDetails
答案 1 :(得分:-3)
尝试使用.Intersect()方法。