Таким образом, основная проблема здесь, как я понимаю: для объединения не связанных сущностей с QueryOver необходимо, чтобы псевдоним был определен как переменная для корневого запроса (ваш QueryOver для студентов).
Как сделать такие объединения, объясненные в NHibernate QueryOver, чтобы объединить несвязанные объекты
Так что, если вы можете изменить свой класс репозитория, чтобы предоставить дополнительную переменную псевдонима для этого QueryOver
, это было бы лучшим решением. Примерно так (я полагаю, вы используете NHibernate 5.1 или выше):
Student studentAlias = null;
var studentsQueryOver= yourRepository.GetQueryOver<Student>(studentAlias);
Exam examAlias = null;
var students = studentsQueryOver
.JoinEntityAlias(() => examAlias, () => examAlias.StudentNumber == studentAlias.Number)
.Where(s => examAlias.Score > 70)
.List();
Если это не вариант, вы все равно можете создавать объединения с несвязанными объектами, но вам нужно создавать их напрямую с базовым корнем Criteria
. Примерно так:
Exam examAlias = null;
studentsQueryOver.RootCriteria
.CreateEntityAlias(
nameof(examAlias),
Restrictions.EqProperty("examAlias.StudentNumber", studentsQueryOver.RootCriteria.Alias + ".Number"),
JoinType.LeftOuterJoin,
typeof(Exam).FullName);
var students = studentsQueryOver
.Where(s => examAlias.Score > 70)
.List();
А в версиях NHibernate до 5.1 вы можете использовать подзапросы:
var subQuery = QueryOver.Of<Exam>()
.Where(e => e.Score > 70)
.Select(e => e.StudentNumber);
subQuery.RootCriteria.Add(Restrictions.EqProperty("StudentNumber", studentsQueryOver.RootCriteria.Alias + ".Number"))
//Or if root query alias variable available simply
//subQuery.And(e => e.StudentNumber == studentAlias.Number)
var students = studentsQueryOver
.WithSubquery.WhereExists(subQuery)
.List();