我试图用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使用不同的路径语法.前者使用斜杠作为路径分隔符,后者使用点.任何人都可以解释为什么语法不一致,我在哪里可以找到扩展路径语法的文档?
DataServiceContextFactory是你自己的类,对吧?(因为那不是你通常实例化DataServiceContext的方式).假设它最终创建了一个普通的DataServiceContext实例,那么急切加载多个级别的方法就是在你的Expand扩展调用中指定多个级别.例如:context.Customers.Expand("订单/产品")将返回所有客户,他们的订单以及这些订单的所有产品.要使LoadProperty正常工作,请确保在DataServiceContext上将属性MergeOption设置为允许跟踪的选项之一.请注意,客户端跟踪与服务器端EF跟踪无关(从技术上讲,它是单独机器上的单独代码).您可以通过尝试调用上下文来验证上下文是否跟踪了相关实体.
| 归档时间: |
|
| 查看次数: |
3278 次 |
| 最近记录: |