Actualización - La respuesta es aparentemente que DbLinq no implementa Dispose()
correctamente. D'oh!¿Por qué es posible enumerar una consulta DbLinq después de llamar a Dispose() en el DataContext?
El abajo es todo tipo de engañosa - En pocas palabras: DbLinq (todavía) no es equivalente a LinqToSql, ya que asumí cuando originalmente hice esta pregunta. Úselo con precaución!
Estoy usando el patrón de repositorio con DbLinq. Mis objetos de repositorio implementan IDisposable
, y el método Dispose()
solo hace una cosa: llama al Dispose()
en el DataContext
. Cada vez que utilice un repositorio, que lo envuelve en un bloque using
, así:
public IEnumerable<Person> SelectPersons()
{
using (var repository = _repositorySource.GetPersonRepository())
{
return repository.GetAll(); // returns DataContext.Person as an IQueryable<Person>
}
}
Este método devuelve un IEnumerable<Person>
, por lo que si mi interpretación es correcta, sin consulta de la base de datos tiene lugar realmente hasta Enumerable<Person>
es atravesado (por ejemplo, mediante la conversión a una lista o matriz o mediante su uso en un bucle foreach
), como en este ejemplo:
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
en este ejemplo, Dispose()
es llamado inmediatamente después de establecer persons
, que es un IEnumerable<Person>
, y eso es el único momento en que se llama.
Así, tres preguntas:
- ¿Cómo funciona esto? ¿Cómo se puede eliminar un
DataContext
aún consultar la base de datos para obtener resultados después de que se haya eliminado elDataContext
? - ¿Qué hace realmente
Dispose()
? - He oído que no es necesario (por ejemplo, consulte this question) deshacerse de un
DataContext
, pero mi impresión es que no es una mala idea. ¿Hay alguna razón no para desechar un DbLinqDataContext
?
¿Qué hace el método 'repository.GetAll()'? ¿Qué devuelve? –
@ Eclipsed4utoo, buena pregunta. Comenté el código. – devuxer