我试图使用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网址是什么?
答案 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; }
}