NHibernate Join Query только с одним экземпляром QueryOver и не определено отношение отображения - PullRequest
0 голосов
/ 01 ноября 2018

В моем случае у меня есть только определенный репозиторий. Скажем «1001 * StudentRepository ». Этот репозиторий скрывает от меня экземпляр ISession , и единственное, что у меня есть, это экземпляр IQueryOver . Рассмотрим ниже объекты имеют упрощенное отображение с NHibernate.

class Student
{
    public int Id {get;set;}
    public string Number  {get;set;}
}

class Exam{
    public int Id {get;set;}
    public double Score {get;set;}
    public string StudentNumber {get;set;}
}

Вы правы, просто добавьте реальное отношение к классу экзамена, например:

публичный Студенческий Студент {get; установить;}

К сожалению, это тоже не вариант

Проблема: мне нужно выполнить запрос с некоторыми критериями, такими как «Оценка> 70» на объекте экзамена из studentRepository. Как я могу создать такой запрос с Nhibernate, не зная сеанса и не определены отношения при отображении.

1 Ответ

0 голосов
/ 02 ноября 2018

Таким образом, основная проблема здесь, как я понимаю: для объединения не связанных сущностей с 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...