如何加载与WCF数据服务的二度实体关系?

Hol*_*roe 3 wcf-data-services

我试图用DataServiceQuery查询数据库中的单个实体.我试图加载的实体与我想要加载的其他实体的图形有关系.MSDN在这里这里描述我可以使用DataServiceQuery <TElement> .Expand或DataServiceContext.LoadProperty加载我的引用实体.

这适用于我的实体的一级关系,但我在加载关系关系时遇到问题.

显然我可以为所有二度关系调用LoadProperty并循环遍历所有二度集合,但我希望我可以在一个查询中急切加载整个关系图.那可能吗?

编辑

实际上加载二度关系并不是那么明显.以下代码失败(为清晰起见,域模型已更改):

            var context = DataServiceReference.DataServiceContextFactory.Create();
            var customer = (from c in context.Customers.Expand("Orders")
                                where c.CustomerId.Equals(customerId)
                                 select c).First();
            foreach (var order in customer.Orders)
            {
                context.LoadProperty(order, "Products");
Run Code Online (Sandbox Code Playgroud)

上面的最后一行抛出InvalidOperationException:"上下文当前没有跟踪实体." 我使用自我跟踪实体.这个错误可能与STE有关吗?

我如何以任何方式加载二级关系?

解决方案编辑

事实证明,与ObjectQuery <T> .Include相比,DataServiceQuery <TElement> .Expand使用不同的路径语法.前者使用斜杠作为路径分隔符,后者使用点.任何人都可以解释为什么语法不一致,我在哪里可以找到扩展路径语法的文档?

Vit*_*SFT 5

DataServiceContextFactory是你自己的类,对吧?(因为那不是你通常实例化DataServiceContext的方式).假设它最终创建了一个普通的DataServiceContext实例,那么急切加载多个级别的方法就是在你的Expand扩展调用中指定多个级别.例如:context.Customers.Expand("订单/产品")将返回所有客户,他们的订单以及这些订单的所有产品.要使LoadProperty正常工作,请确保在DataServiceContext上将属性MergeOption设置为允许跟踪的选项之一.请注意,客户端跟踪与服务器端EF跟踪无关(从技术上讲,它是单独机器上的单独代码).您可以通过尝试调用上下文来验证上下文是否跟踪了相关实体.