WCF服务操作返回对象图

时间:2012-07-17 15:27:16

标签: linq wcf-data-services odata

我有一个WCF服务操作,我希望它返回一个对象图而不是一个简单的对象列表。是否有一些神奇的LinQ可以做到这一点?

由于

可能需要更多信息:

我有几个实体:

StockableItem
+ Id
+代码

库存
+ Id
+位置
+数量

StockableItem->股票是1 .. *关系。

我失败了这个linq:

来自svc.StockableItems.Include(“Stock”)中的si 在svc.Stock上加入s.Id等于s.Id
其中s.Location == 1 选择si

和几种变化。

我希望服务操作能够返回这样的内容:

StockableItem - ID = 213,代码= xxx
StockableItem - ID = 214,代码= xxx2
+股票 - ID = 214,位置= 1,数量= 3 StockableItem - ID = 215,代码= xxx3
StockableItem - ID = 216,代码= xxx4
+股票 - ID = 216,位置= 1,数量= 6

即。返回所有StockableItems以及给定位置的Stock条目。它几乎只是一个左外连接:

从StockableItems中选择* 左外连接股票ON si.Id = s.Id和s.Location = @Location

但变成了对象图。

2 个答案:

答案 0 :(得分:1)

从上面的查询中不清楚你想要做什么。使用WCF DS客户端,您可以添加钻取属性的where子句:

from si in svc.StockableItems
where si.Stock.Location == 1
select si
// Results in something like http://services.odata.org/Experimental/OData/OData.svc/Products?$filter=Category/Name eq 'Beverages'

您还可以使用Expand方法明确地执行急切加载,或者在投影中包含该加载:

svc.StockableItems.Expand("Stock").Where(si => si.Stock.Location == 1) // OR
from si in svc.StockableItems
where si.Stock.Location == 1
select si, si.Stock
// Results in something like http://services.odata.org/Experimental/OData/OData.svc/Products?$filter=Category/Name eq 'Beverages'&$expand=Category

答案 1 :(得分:1)

现在还不完全清楚;听起来你理想地想要一个OData解决方案。您无法从通过OData查询调用的WCF数据服务服务操作返回对象图。您可以获得一个平面的对象列表,但需要使用$ expand来获取对象图。在您的情况下,$ expand将无效,它将返回所有StockItems通过过滤器的库存实例。

我认为你最好的选择是在你的数据库中创建一个视图(我假设你有一个位置表?)

    SELECT       si.Id, Locations.Location 
    FROM         StockableItem AS si  
    CROSS JOIN   Locations

在您的实体模型中,将此视图添加为实体(称为XXX说)并在其与StockableItem和Stock实体之间设置导航属性。

现在您可以运行像

这样的OData查询
.../XXX?$expand=StockableItem,Stock&$filter=isof(Stock,'YourModelName.Stock') and Location eq 1

这不是您所追求的确切对象图,但除非您想开始添加客户端链接,否则它将是您获得的最佳效果。