假设我有三个简单的表
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不可识别。
感谢。
答案 0 :(得分:3)
如果您只想要一个字符串列表,则不需要使用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;