Tengo una relación principal-secundario entre Teacher
y StudentReport
. Cada StudentReport
tiene una grabación de campo de marca de tiempo cuando el profesor terminó el informe. Tengo una consulta para encontrar todos los maestros que han completado uno o más de sus informes a partir de un cierto número de minutos atrás:consulta de NHibernate con criterios sobre el miembro de la colección hijo devuelve solo la colección secundaria parcial
public IList<Teacher> FindRecentlyActiveTeachers(int intervalMinutes)
{
if (intervalMinutes <= 0)
throw new ArgumentException("Interval must be a positive number of minutes");
DateTime activityCutoff = DateTime.Now.AddMinutes(-1 * intervalMinutes);
return Session.QueryOver<Teacher>()
.Left.JoinQueryOver<StudentReport>(t => t.StudentReports)
.Where(r => r.FirstSaveTimestamp >= activityCutoff)
.TransformUsing(Transformers.DistinctRootEntity)
.List<Teacher>();
}
Esto devuelve la lista correcta de los profesores, pero la colección infantil para cada profesor sólo contiene los informes que coinciden con el criterio de selección. Me gustaría que la recopilación de informes de cada maestro coincidente contenga todos los informes, no solo los pocos informes que cumplen con los criterios.
¿Hay alguna forma en que puedo cargar la colección completa de elementos secundarios con impaciencia u omitir la carga en esta consulta y confiar en la carga lenta?
actualización
Ésta es la solución:
return Session.QueryOver<Teacher>()
.Fetch(t => t.StudentReports).Eager
.JoinQueryOver<StudentReport>(t => t.StudentReports)
.Where(r => r.FirstSaveTimestamp >= activityCutoff)
.TransformUsing(Transformers.DistinctRootEntity)
.List<Teacher>();
Sólo un consejo al azar sin relación a su pregunta. Para negar su intervalMinutes puede escribir '-intervalMinutes' y le dará el valor negativo del número positivo pasado. En lugar de tener que hacer '-1 * intervalMinutes' – Phill