1

結果を返すデータベースへのクエリがあり、別の IEnumerable を含む IEnumerable があり、Model Populator で次のようなことを行います

List<Parent> parents = Result1;
List<Children> children = Result2;

その後

foreach (parent p in parents)
{
 p.MyChildren = children.Where(x => x.ParentId == p.Id);
}

私はこれまでデバッグしてきましたが、ループ中とモデルを含む最終モデルの両方でモデルを返すまでに、データは正しいです。

ただし、コントローラーで親のリストを取得すると、少し前に正しかったとしても、それらはすべて同じ子コレクションを持っています。つまり、各親は「MyChildren」に同じランダム コレクションを持ち、それらに属するコレクションは持ちません。

ビュー モデルには静的変数がなく、モデルからコントローラーへの他のオブジェクト操作はありません。

参照で何か非常に奇妙なことが起こっており、それを解決する方法がわかりません。何か案は?

4

1 に答える 1

3

ToList()子を設定するときに、右側に追加してみてください。

foreach (parent p in parents)
{
    var id = p.Id;
    parent.MyChildren = children.Where(x => x.ParentId == id).ToArray();
}

の結果は でWhereありIEnumerable、アイテムの実際の取得は延期されます。つまり、何かが後で変更された場合、parent.MyChildren変更されます。追加するToArray()と、列挙がすぐに実行されます。

Servy のコメントごとに更新

(上記で更新)のローカル (foreachブロック内) コピーも作成する必要があります。p.Idこの問題は「変更されたクロージャへのアクセス」と呼ばれます 詳細情報:たとえば。Eric Lippert からの回答を含む、詳細な背景については、here も参照してください。彼は、変更されたクロージャをC# の最悪の「落とし穴」の 1 つとして説明しています。

于 2012-12-06T19:08:33.303 に答える