nhibernate queryover如何选择别名列?

时间:2012-03-08 14:57:21

标签: nhibernate queryover

假设我有三个简单的表

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 个答案:

答案 0 :(得分:3)

如果您只想要一个字符串列表,则不需要使用WithAliasWithAlias用于将该列投影到结果对象上的成员中。

这样的事情应该有效:

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;