【问题标题】:nhibernate queryover how to select an alias column?nhibernate queryover如何选择别名列?
【发布时间】:2012-03-08 23:44:47
【问题描述】:

假设我有三个简单的表

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,并且学生名无法识别。

谢谢。

【问题讨论】:

    标签: nhibernate queryover


    【解决方案1】:

    如果您只需要一个字符串列表,则不需要使用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;
    

    【讨论】:

    • 太棒了!有效.. 嗯.. 所以withAlias 仅与 Transform 一起使用?
    • 另外,请问我现在如何通过这个studentAlias.Name 订购?
    • @LocustHorde:是的! WithAliasTransformUsing 一起使用。 OrderBy 应该够简单,一秒……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多