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