【发布时间】:2010-05-17 18:38:27
【问题描述】:
更新 - 答案显然是 DbLinq 没有正确实现 Dispose()。哦!
以下内容具有误导性 - 底线:DbLinq 不(尚未)等同于 LinqToSql,正如我最初提出这个问题时所假设的那样。谨慎使用!
我将存储库模式与 DbLinq 一起使用。我的存储库对象实现了IDisposable,而Dispose() 方法只做一件事——在DataContext 上调用Dispose()。每当我使用存储库时,我都会将其包装在 using 块中,如下所示:
public IEnumerable<Person> SelectPersons()
{
using (var repository = _repositorySource.GetPersonRepository())
{
return repository.GetAll(); // returns DataContext.Person as an IQueryable<Person>
}
}
这个方法返回一个IEnumerable<Person>,所以如果我的理解是正确的,那么在遍历Enumerable<Person>之前实际上不会对数据库进行查询(例如,通过将其转换为列表或数组或在@中使用它987654331@ 循环),如本例所示:
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() 在设置 persons 后立即被调用,这是一个 IEnumerable<Person>,这是唯一一次被调用。
那么,三个问题:
- 这是如何工作的?在
DataContext已被处置后,已处置的DataContext如何仍会查询数据库以获取结果? -
Dispose()究竟做了什么? - 我听说没有必要(例如,参见 this question)处置
DataContext,但我的印象是这不是一个坏主意。是否有任何理由不处置 DbLinqDataContext?
【问题讨论】:
-
repository.GetAll()方法有什么作用?它返回什么? -
@Eclipsed4utoo,好问题。我注释了代码。