私からの LINQ に関する質問が他にもありました。
現在、私は内部 SQLite データ ソースを使用する Web サイトに取り組んでいます。Entity Frameworkを利用して、LINQ-To-SQLを使用して「話す」ようにしています。ここで、複雑なオブジェクトがあるとします。このオブジェクトにはリストが含まれており、1 対多の関係をマップします。
ParentObject {
Integer Id
List<RelatedObject> RelatedObjects
string SomeField
}
RelatedObject {
Integer Id
ParentObject Parent
NestedObject Nested
string SomeField
}
NestedObject {
Integer Id
RelatedObject Parent
string SomeField
}
これは変更できない DB 構造です。ページの読み込み時にコンテキストでクエリを実行しているとします。
var results = context.ParentObjects.Where(parent => parent.SomeField == AnotherField).ToList();
私の知る限り、ToList()
linq を使用するとそこでクエリを実行するように "強制" されるため、遅延実行について心配する必要がなくなります。したがって、これを行うのは安全です:
result = results.First();
(result は if() ステートメントにより results() の外側のスコープで定義されます)。
拡張メソッドを試して実行するまで、これで問題なく動作します。これにより、次のことが行われます。
// Assume this is an extension method on ParentObject
return this.RelatedObjects.Where(related => this.SomeField == related.SomeField).Select(related.Nested).First();
(説明しようとすると非常に複雑になります)
「this」(ParentObject) が作成された DataContext が破棄されているため、例外が発生します。
私の質問は、コンテキストが終了した後、どのようにList<RelatedObject> RelatedObjects
フィールド内にアクセスできますか?ParentObject