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数据服务,实体框架,LINQ->;孩子中的孩子

下面是我的发现:

首先,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

问候,