2017-01-24 10 views
0

別のリスト(ParentItems)のフィールドであるフィールド内のフィールド(ChildItems)である値(StatusName)を置き換える必要があります。私はここに私は、私はこれをやっていないよ確信している非同期/待つと正しく別のメソッドを呼び出すサブリストのタスク/非同期ラムダ

をたくさん働いていない私がしようとしているものの例である:

public class parentItem { 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public string Description {get;set;} 
    public List<childItem> ChildItems {get;set;} 
} 

public class childItem { 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public string StatusId {get;set;} 
    public string StatusName {get;set;} 
} 

// Populate parent in list. 
List<parentItem> parents = new List<parentItem>(); 
//populate.... 

を私たちは、データ呼を持っています非同期待機メソッドでこれらの要素を設定します。この方法では

// lambda I was hoping to try 
parents = parents.Select((par) => { 
    par.ChildItems = par.ChildItems.Select((sub) => { 
     sub.StatusName = await ChangeChildStatusName(sub.StatusId); 
    }).ToList(); 
    return par; 
}); 

public async Task<string> ChangeChildStatusName(int statusId) { 
    // code. 
} 

ChangeChildStatusName)データベース呼び出し取得がある:私はこのような状況の値

種類を変更します別のメソッドを呼び出します簡単なラムダ式を行うことを期待していました必要なその他の情報私はこのようなもののための別のアプローチがあると確信していますが、これまでのところ私はこのシナリオに合った解決策を見つけることができませんでした。

+0

「選択」は、シーケンス内の各アイテムを別のアイテムに変換します。シーケンス内の各項目に対していくつかのコードを実行するだけではありません。あなたは 'foreach'を使います。すべての同期をとっていても、コードは機能しません。 – Servy

答えて

0

ここの鍵は、あなたのタイプに注意することです。内部Selectreturn sub;を追加した後)の結果はList<Task<childItem>>で、await Task.WhenAll(..)と一緒に使用すると、(非同期に)完了するまで待つことができます。同様に、あなたの親タスクは、同じ技術を使用することができます。

var parentTasks = parents.Select(async (par) => { 
var childTasks = par.ChildItems.Select(async (sub) => { 
    sub.StatusName = await ChangeChildStatusName(sub.StatusId); 
    return sub; 
}); 
par.ChildItems = (await Task.WhenAll(childTasks)).ToList(); 
return par; 
}); 
parents = (await Task.WhenAll(parentTasks)).ToList(); 

しかし、あなたの特定のケース(データベースへのアクセス)で、あなたはおそらく唯一とにかく一度に一つのデータベース呼び出しを行うことができますので、あなたのネストされたSelectを交換する必要がありますsはネストしてforeach

foreach (var par in parents) 
    foreach (var sub in par.ChildItems) 
    sub.StatusName = await ChangeChildStatusName(sub.StatusId); 
関連する問題