【问题标题】:WCF Data Services, Entity Framework, LINQ -> Children within childrenWCF 数据服务、实体框架、LINQ -> 子项中的子项
【发布时间】:2012-03-29 23:53:13
【问题描述】:

我似乎无法访问父子子子项。 IE。 WorkOrder 有 1 个单元,有 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 单元,对单元/建筑物执行相同操作,然后再将构建到站点再加载 1 次。但这对于我正在尝试做的事情来说似乎太过分了。

我想我想做的是在 1 个查询中展开所有子项。

有什么想法吗?

【问题讨论】:

    标签: c# wcf wcf-data-services


    【解决方案1】:

    这就是我发现的:

    首先,WCF 数据服务不支持延迟加载proof。这意味着这段代码永远不会工作:

    var workOrder = context.WorkOrders.First();
    string siteId = workOrder.Unit.Building.Site.Id.ToString(); // won't work w/ WCF Data Services
    

    然后我想我可以使用像下面这样的连接,但是 WCF 数据服务不支持连接 proof:

    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,
        };
    

    最后,在查看了 expand oData expand 的 oData 规范后,我发现我原来的 Expand 用法与我想要的很接近,这行得通

    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
    

    【讨论】:

      【解决方案2】:

      您绝对应该看看 LINQ 和实体框架的加载机制 - 我猜您遇到了延迟加载“问题”。参考请访问http://msdn.microsoft.com/en-us/library/bb896272.aspx

      您好,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多