WCF数据服务,实体框架,LINQ->;孩子中的孩子
本文关键字:孩子 gt LINQ- 数据 服务 实体 框架 WCF | 更新日期: 2023-09-27 18:29:33
我似乎无法访问父子关系。IE.工单有1个单元,其中有1栋建筑,其中有一个现场
我已经迫不及待地加载了这个单元,但我似乎无法再"深入"了。
代码:
int workOrderId = 1;
var workOrder = context.WorkOrders.Expand("Unit").Where(w => w.Id == workOrderId).First();
string siteId = workOrder.Unit.Building.Site.Id.ToString(); // kaboom (null)
理论上,我可以急切地加载WorkOrder单元,对单元/建筑进行同样的操作,然后再对建筑进行一次到现场的操作。但这对我想做的事情来说似乎太过分了
我想我想做的是在一个查询中扩展所有的子项。
有什么想法吗?
下面是我的发现:
首先,WCF数据服务不支持延迟加载验证。这意味着这个代码永远不会工作:
var workOrder = context.WorkOrders.First();
string siteId = workOrder.Unit.Building.Site.Id.ToString(); // won't work w/ WCF Data Services
然后我想我可以使用下面这样的联接,但是WCF数据服务不支持联接证明:
var query =
from wo in context.WorkOrders
join unit in context.Units on wo.Id equals unit.Id
join building in context.Buildings on unit.Id equals building.Id
join site in context.Sites on building.Id equals site.Id
where wo.Id == workOrderId
select new
{
SiteId = site.Id,
};
最后,在查看了扩展oData扩展的oData规范后,我发现我最初的扩展用法与我想要的非常接近,这很有效:
int workOrderId = 1;
var workOrder = context.WorkOrders.Expand("Unit/Building/Site").Where(w => w.Id == workOrderId).First();
string siteId = workOrder.Unit.Building.Site.Id.ToString(); // shows site id
你肯定应该看看LINQ和实体框架的加载机制——我猜你遇到了一个懒惰加载的"问题"。供参考访问http://msdn.microsoft.com/en-us/library/bb896272.aspx
问候,