2017-07-29 7 views
1

私は下記のitemsクエリで競合状態にあります。 select 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は、データベース呼び出しを同期して実行するように強制していました。これはmiIds.ItemIdの代わりにitem.Idを選択したかったのが本当に意味が分かりません。 –

答えて

1

あなたの問題は、それがクエリmissionItemIdsが列挙されていないことを隠すvarの利用から生じている、シンプルです。そのクエリが実際に実行させるために、あなたはシーケンス(例えば.ToList())を実体化コールを使用する必要があります。

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

をあなたの実際の結果をマテリアライズ時間によってgame.CurrentMissionIdが変化しているようです。