2011-05-11 82 views
1

RIA服务查询我想要做类似下面我在哪里加载并行一些相关的数据,每个已经载入实体的集合的东西:加载多个在同一时间

foreach (var parentThing in ParentThings) 
    { 
     Context.Load(Context.GetChildThingForParentQuery(parentThing.Id), op => 
      { 
       parentThing.Child = op.Entities.FirstOrDefault(); 
      }, null); 
    } 

然而,这不是” t似乎工作。数据全部混入回调lambda中,例如parentThing始终是集合中的LAST对象,op.Entities始终只包含FIRST子元素。

回答

1

的问题与您foreachaccessing a modified closure造成的。尝试:

foreach (var temp in ParentThings) 
{ 
    var parentThing = temp; 
    Context.Load(Context.GetChildThingForParentQuery(parentThing.Id), op => 
     { 
      parentThing.Child = op.Entities.FirstOrDefault(); 
     }, null); 
} 
+0

啊哈!谢谢,这让它工作。 – user380689 2011-05-12 00:10:52

1

想想这样,因为它接收回调的时间是异步的,foreach循环已经通过了当前的parentThing很长时间,这就是为什么你会得到混合结果(Lemans术语,我相信其他人能够就此给你一个更好的答案)。

我已经看到在过去最好是逐一解雇这些人,并在继续之前等待第一个结果,这样你可以保留最后一个触发的parentThing在一个全局变量或类似的东西,你会收到回正确的孩子实体。

int counter = 0; 
    object lastParentThing; 

    protected void loopParentThings() 
    { 
     lastParentThing = ParentThings[counter]; 
     counter++; 

     Context.Load(Context.GetChildThingForParentQuery(lastParentThing.Id), op => 
     { 
      lastParentThing.Child = op.Entities.FirstOrDefault(); 
      loopParentThings() 
     }, 
     null); 
    } 
+0

嗯,我想我明白了。因此,没有简单的方法可以立即启动所有查询并将每个查询处理为已完成? – user380689 2011-05-11 06:38:08

+0

在这种情况下,是的,你可以改变它成为一个InvokeOperation,这样你可以传递一个对象作为你的父实体的状态,并返回一个值,这是你的子实体 – 2011-05-11 06:54:59