以下は私のコードを簡略化したものです。私はGetPerson1()
とGetPerson2()
の唯一の違いは、選択基準を変更せずに、クエリの実行を強制的に.ToList()
句であることを考えれば、等しくなるようにp1
とp2
が等しくなるように期待し、またp1_after
とp2_after
でしょう。Linq `Where`句のクエリ結果は、クエリが遅延して実行されるのか、遅く実行されるのかによって異なる可能性がありますか?
私の前提は間違っていますか?私はp1_after
とp2_after
が異なる(p2_after
は年齢が26に変更されたため、期待どおりにnullになっています)、私のプログラムでバグを発見しました。しかしp1_after
にはまだp1
と同じインスタンスが含まれています。
この動作は正常ですか?私がチェックしたいのは私には論理的ではないようです。 p1_after
にもかかわらずp1_after.Age
戻り26は、そのAge
が25
public void OnGet()
{
Person p1 = GetPerson1();
Person p2 = GetPerson2();
p1.Age = 26;
p2.Age = 26;
Person p1_after = GetPerson1(); // not null, but p1_after.Age is 26
Person p2_after = GetPerson2(); // null
}
public Person GetPerson1()
{
return _context
.Persons
.Where(p => p.Age == 25)
.SingleOrDefault();
}
public Person GetPerson2()
{
return _context
.Persons
.ToList()
.Where(p => p.Age == 25)
.SingleOrDefault();
}
いずれかのefは、 '.ToList()'を使うときに何らかの形のメモリキャッシュを使うか、バグです。私は彼らのgithubに行くことをお勧めしたい、問題を作成し、devsがこれについて何を言わなければならないか見る。 –
データベースからエンティティを再フェッチするときにEFがチェンジ・トラッカーのローカル変更を上書きしないことがわかっている場合は、すべて意味があります。 'p1'、' p2'、 'p1_after'は同じオブジェクトへの参照ですが、' p2_after'は何も出てこないクエリの結果に過ぎません。 –