over - ¿Es esta la manera correcta de cargar ansiosamente colecciones de niños en NHibernate?
query over (1)
Me gustaría agregar un punto de vista diferente, no la respuesta de cómo usar "futuro" para hacer solo un viaje de ida y vuelta a DB.
No estoy seguro de por qué necesita recuperar todas las propiedades. Supongo que podría ser 1) para ser utilizado por tu código, por ejemplo, para representar UI o 2) como la API que de alguna manera lo serializa y lo pasa al cliente.
En el primer escenario, sugeriría usar la sesión por solicitud y usar la carga diferida. En el segundo, sugeriría introducir un paso: construir el DTO antes de pasarlo al cliente. Eso podría hacerse mientras la sesión aún está abierta, por lo tanto, use la carga diferida.
Carga lenta en ambos escenarios. Por lo tanto, en ambos casos, sugeriría usar un enfoque diferente y luego una búsqueda explícita. Utilizará más o menos la misma cantidad de selecciones y viajes de ida y vuelta a DB. Pero al final podría ser más efectivo. Porque todo ese trabajo quedaría en el NHibernate
El objetivo es cambiar la carga de búsqueda ansiosa (manual) con la carga de tamaño de lote (nativo). Ver más aquí 19.1.5. Utilizando la recuperación de lotes . En este caso, NHibernate procesará su consulta, y luego irá nuevamente con algunas consultas más para cargar los datos restantes. Pero solo si realmente se necesita
La ventaja es que no eres un prisionero de tus consultas. Puede consumir cualquier propiedad que podría / debería estar disponible en la entidad, hasta que la sesión esté abierta (es decir, durante la representación de Vista o la serialización). No necesita ir y anexar otra consulta explícita sobre la unión para obtener datos ansiosos.
Entonces, mientras que Future podría ser una solución para el mundo donde tu conectividad a DB desde APP es muy lenta ... no es el mundo el que usa NHibernate (ORM). La ventaja del mapeo perezoso y la carga ad hoc (con el poder de procesamiento por lotes) es desde la perspectiva del mantenimiento de la manera correcta ... yo diría
He usado demasiado tiempo para encontrar una buena manera de cargar las colecciones de niños ansiosos. hasta ahora esto es lo que obtuve. Está funcionando, pero me resulta difícil creer que esta es la mejor manera de escribir esta consulta
[Fact]
public void EagerLoadQueryOverWithFutureTest()
{
const long journalNr = 1470;
var query = _repo.QueryOver().Where(s => s.JournalNr == journalNr).Future<Sag>();
var sagsansoegning = _repo.QueryOver().Where(an => an.JournalNr == journalNr).Fetch(x => x.Sagsansoegning).Eager.Future<Sag>();
var noter = _repo.QueryOver().Where(n => n.JournalNr == journalNr).Fetch(x => x.Noter).Eager.Future<Sag>();
var filer = _repo.QueryOver().Where(f => f.JournalNr == journalNr).Fetch(x => x.Filer).Eager.Future<Sag>();
var emails = _repo.QueryOver().Where(e => e.JournalNr == journalNr).Fetch(x => x.Emails).Eager.Future<Sag>();
var journal = _repo.QueryOver().Where(j => j.JournalNr == journalNr).Fetch(x => x.Journal).Eager.Future<Sag>();
var sagsTilstand = _repo.QueryOver().Where(t => t.JournalNr == journalNr).Fetch(x => x.Tilstand).Eager.Future<Sag>();
var boligsocialEvalueringer = _repo.QueryOver().Where(b => b.JournalNr == journalNr).Fetch(x => x.BoligsocialEvaluering).Eager.Future<Sag>();
var result = query.SingleOrDefault();
result.JournalNr.Should().Be(journalNr);
result.Emails.Should().HaveCount(c => c > 20);
result.Filer.Should().HaveCount(c => c > 20);
}