我有一个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
但变成了对象图。
答案 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
这不是您所追求的确切对象图,但除非您想开始添加客户端链接,否则它将是您获得的最佳效果。