【问题标题】:Inner Join and Outer Join In OdataOdata 中的内连接和外连接
【发布时间】:2014-08-10 21:23:27
【问题描述】:

我正在尝试使用来自 OData 服务的数据。 我想知道OData中是否有内连接和外连接的概念?如果没有,有什么方法可以实现。

客户ID---------客户名称
1 -----------------------------------阿尔弗雷德·富特基斯特
2------------------------------------安娜·特鲁希略
3 ----------------------------------安东尼奥·莫雷诺

从“订单”表中选择:

OrderID--------客户ID

10308-----------------2

10309-----------------37

10310----------------77

输出应该是外部连接的情况---

名称-------------------OrderId

Alfreds Futterkiste-----------------null

安娜·特鲁希略------------------------------------10308

安东尼奥·莫雷诺----------------------null

null--------------------------------10309

null--------------------------------10310

这个案例的 OData URL 是什么?

【问题讨论】:

  • 您能否举一个简化示例来说明您的源数据和预期结果?它需要是一个 url 调用还是你有工具来进行一次调用然后迭代第一个结果集以产生第二个?
  • @mdisibio 我已经编辑了问题。请检查

标签: rest join odata inner-join outer-join


【解决方案1】:

对于 OData V4.0,有一个 extension for data aggregation,其中显示了 Cross-join concept

【讨论】:

  • OData v2 中没有这个。对吧?
  • 对相关实体集使用$expand和$filter可以达到内连接和外连接类似的结果。
  • GET ~/Table1?$expand=NavigationProp_TAble2 这个查询默认返回Outer Join?
  • @user3580062 我认为这是内部联接。
  • @Maya,据我了解,是left Join 即Table1 Left Join Table2
【解决方案2】:

在 Sql Server 中,您需要发出 FULL OUTER JOIN 才能获得上述结果。但是,您发布的结果只有在 Order.CustomerId 上没有数据库强制外键关系的情况下才能获得,否则每个 Order 都会有一个 Customer,并且第一列永远不会有 null。

CROSS JOIN 将简单地将每个客户与每个订单匹配。)

所以FULL JOIN sql 查询将是:

         SELECT ISNULL(C.CustomerName,'') AS CustomerName, ISNULL(O.OrderId,0) AS OrderId
           FROM Customers C
FULL OUTER JOIN Orders O ON C.CustomerId = O.CustomerId

我不知道有任何 oData 语法可以从基于两个表的实体模型中产生这样的结果。但是,如果确实需要,您可以使用上述语法生成一个视图,然后创建一个表示完全连接结果的单个 oData 实体,并对其进行查询。

假设您创建了这样一个视图,并使用一些默认值而不是上面的空值,那么 oData 语法将是:

/CustomerOrders()?$expand=Customer,Order&$select=Customer/CustomerName,Order/OrderId

产生:

CustomerName                       OrderId
Ana Trujillo Emparedados y helados 10308
                                   10309
                                   10310
Alfreds Futterkiste                    0
Antonio Moreno Taquería                0

我的 C# CustomerOrder 类/模型如下所示:

public class CustomerOrder
{
  [Key]
  public int Id { get; set; }

  public int OrderId { get; set; }

  public int CustomerId { get; set; }

  [ForeignKey("CustomerId")]
  public Customer Customer { get; set; }

  [ForeignKey("OrderId")]
  public Order Order { get; set; }

}

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2016-11-25
    • 2023-04-04
    • 2015-01-28
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多