nhibernate запрос, как выбрать псевдоним столбца? - PullRequest
2 голосов
/ 08 марта 2012

Предполагая, что у меня есть три простые таблицы

schedule 
{
    Student student { get; set;}
    Teacher teacher { get; set;}
    bool Deleted { get; set; }
}

Student
{
    string Name { get; set; }
    IList<schedule> TeacherMeetings {get; set; }
}

, и предположим, что учитель имеет то же самое, имя и список расписаний учеников.

Я хочу выбрать из списка список всех имен учеников для конкретного учителя.Я могу написать запрос об условиях и обо всем, но не могу выбрать только имена учеников.

Вот мой текущий запрос:

    DetachedCriteria dc = QueryOver.Of<Schedule>(() => sAlias)
    .JoinAlias(() => sAlias.student, () => studentAlias)
    .JoinAlias(() => sAlias.teacher, () => teacherAlias)
    .Where(() => teacherAlias.MembershipGuid == teacherGuid)
    .AndNot(() => sAlias.isDeleted)
    //.Select(() => studentAlias.Name)
    .SelectList(list => list
        .SelectGroup(x => x.student.Name).WithAlias(() => studentAlias.Name))
    .DetachedCriteria
    ;

Если я закомментирую все select, профилировщикпоказывает, что запрос сгенерирован как правильный, с правыми объединениями только для правых таблиц, он выбирает все столбцы во всех таблицах.

Кажется, я не могу получить select правильно, мне нужно толькоstudent.Name только.

Как мне написать это, пожалуйста?Я занимался этим более часа, пробуя разные вещи, но это всегда ошибки выбора, говоря, что NHibernate.QueryException: could not resolve property, и что studentName не распознается.

спасибо.

1 Ответ

3 голосов
/ 08 марта 2012

Если вы просто хотите получить список строк, вам не нужно использовать WithAlias.WithAlias используется для проецирования этого столбца в элемент в результирующем объекте.

Примерно так должно работать:

DetachedCriteria dc = QueryOver.Of<Schedule>(() => sAlias)
    .JoinAlias(() => sAlias.student, () => studentAlias)
    .JoinAlias(() => sAlias.teacher, () => teacherAlias)
    .Where(() => teacherAlias.MembershipGuid == teacherGuid)
    .AndNot(() => sAlias.isDeleted)
    .SelectList(list => list
        .Select(() => studentAlias.Name))
    .DetachedCriteria;

Таким образом, следующий список должен получить вам список строк:

IList<string> names = dc.GetExecutableCriteria(session)
    .List<string>();

Обновление (за комментарий).Вот как вы должны сделать заказ по имени ученика по убыванию:

DetachedCriteria dc = QueryOver.Of<Schedule>(() => sAlias)
    .JoinAlias(() => sAlias.student, () => studentAlias)
    .JoinAlias(() => sAlias.teacher, () => teacherAlias)
    .Where(() => teacherAlias.MembershipGuid == teacherGuid)
    .AndNot(() => sAlias.isDeleted)
    .SelectList(list => list
        .Select(() => studentAlias.Name))
    .OrderBy(() => studentAlias.Name).Desc()
    .DetachedCriteria;
...