更新- 答えは明らかに、DbLinq がDispose()
適切に実装されていないことです。ああ!
以下はあらゆる種類の誤解を招くものです-結論:DbLinqは(まだ)LinqToSqlと同等ではありません.最初にこの質問をしたときに想定したように. 注意して使用してください!
DbLinq でリポジトリ パターンを使用しています。私のリポジトリ オブジェクトは を実装IDisposable
し、Dispose()
メソッドDispose()
はDataContext
. リポジトリを使用するときはいつでも、次using
のようにブロックでラップします。
public IEnumerable<Person> SelectPersons()
{
using (var repository = _repositorySource.GetPersonRepository())
{
return repository.GetAll(); // returns DataContext.Person as an IQueryable<Person>
}
}
このメソッドは を返すので、私の理解が正しければ、次の例のように (たとえば、リストまたは配列に変換するか、ループで使用することによって) をトラバースするIEnumerable<Person>
まで、データベースのクエリは実際には行われません。Enumerable<Person>
foreach
var persons = gateway.SelectPersons();
// Dispose() is fired here
var personViewModels = (
from b in persons
select new PersonViewModel
{
Id = b.Id,
Name = b.Name,
Age = b.Age,
OrdersCount = b.Order.Count()
}).ToList(); // executes queries
この例でDispose()
は、 は set の直後に呼び出されますpersons
。これは であり、IEnumerable<Person>
呼び出されるのはそのときだけです。
だから、3つの質問:
- これはどのように作動しますか?
DataContext
が破棄された後も、破棄されたオブジェクトが結果をデータベースに照会するにはどうすればよいDataContext
ですか? - 実際には何をし
Dispose()
ますか? - を処分する必要はないと聞いたことがありますが (たとえば、この質問
DataContext
を参照してください) 、それは悪い考えではないというのが私の印象です。DbLinq を処分しない理由はありますDataContext
か?