0

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

谢谢

可能需要更多信息:

我有几个实体:

StockableItem
+ Id
+ 代码

库存
+ 编号
+ 位置
+ 数量

StockableItem->Stock 是 1..* 关系。

我在这个 linq 上失败了:

从 si in svc.StockableItems.Include("Stock")
join s in svc.Stock on si.Id 等于 s.Id
where s.Location == 1 select si

和几个变化。

我希望服务操作能够返回如下内容:

StockableItem - ID=213, Code=xxx
StockableItem - ID=214, Code=xxx2
    + Stock - ID=214, Location=1, Qty=3
StockableItem - ID=215, Code=xxx3
StockableItem - ID=216, Code=xxx4
    + 库存 - ID=216,位置=1,数量=6

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

Select * from StockableItems si
Left outer join Stock s ON si.Id = s.Id and s.Location = @Location

但变成了一个对象图。

4

2 回答 2

1

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

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

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

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

现在您可以运行 OData 查询,例如

.../XXX?$expand=StockableItem,Stock&$filter=isof(Stock,'YourModelName.Stock') and Location eq 1

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

于 2012-09-20T13:32:28.453 回答
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
于 2012-07-17T16:23:17.453 回答