2017-07-29 53 views
1

我有以下項目查詢的競賽狀況。選擇miIds.ItemId不會等待allItemList數據庫調用完成返回所有結果。解決這個問題的最好方法是什麼?我是否應該將查詢拉出任務並在開始查詢之前等待它返回,或者在查詢中可以做些什麼來讓它等待? 謝謝。linq查詢中的賽車狀況

private async Task LoadData() 
    { 
     // Query Mission_Item Ids. 
     var missionItemsList = await App.Database.GetTableAsync<Mission_Items_Model>(); 
     var missionItemIds = from missionItem in missionItemsList 
          where missionItem.MissionId == game.CurrentMissionId 
          select missionItem; 

     // Query All Items, select item where item's itemIds match mission's itemIds. 
     var allItemList = await App.Database.GetTableAsync<ItemModel>(); 
     var items = from item in allItemList 
        let mi = (from miIds in missionItemIds where miIds.ItemId == item.Id select miIds.ItemId) 
        where mi.Contains(item.Id) 
        select item; 

     // Item list for mission. 
     ItemsList = new List<ItemModel>(items); 

     ... 

    } 
+2

你如何使用'await'並且有競爭狀態?你確定你理解這個問題嗎? – user3185569

+0

謝謝!當我運行代碼時,missionItemsList每次都會返回一個隨機數的對象。如果我註釋掉linq查詢,那麼missionItemsList總是返回正確的項目數。我雖然說,選擇miIds.ItemId強制數據庫調用同步運行。這真的沒有道理,我現在看到,想要我選擇的是item.Id而不是miIds.ItemId。 –

回答

1

你的問題很簡單,它是從var隱藏該查詢missionItemIds沒有被列舉的使用造成。爲了使該查詢到實際執行,您需要使用物化序列(.ToList()爲例)的電話:

var missionItemIds = (from missionItem in missionItemsList 
        where missionItem.MissionId == game.CurrentMissionId 
        select missionItem).ToList(); 

似乎game.CurrentMissionId正在發生變化的時候你的實際兌現的結果。