内部加入和外部加入Odata

时间:2014-06-20 07:13:40

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

我试图使用OData服务中的数据。 我想知道在OData中是否存在内部和外部连接的概念?如果没有,是否有任何方法可以执行相同的操作。

的CustomerID ----------------------客户名称
1 ----------------------------------- Alfreds Futterkiste
2 ------------------------------------ Ana Trujillo
3 ---------------------------------- Antonio Moreno

从“订单”表中选择:

的OrderID --------客户id

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

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

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

输出应该是外部加入---

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

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

Ana Trujillo ------------------------ 10308

Antonio Moreno ---------------------- null

空-------------------------------- 10309

空-------------------------------- 10310

此案例的OData网址是什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

(A 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实体,并查询它。

假设你创建了这样一个视图,并使用了一些默认值而不是如上所述的null,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; }

}