如何在nhibernate中执行子查询?

如何在nhibernate中执行子查询?,nhibernate,queryover,Nhibernate,Queryover,我需要对子集合执行子查询,但无法使其工作 我试过这个 Task tAlias = null; List<Task> result = session.QueryOver<Task>(() => tAlias) .Where(Restrictions.In(Projections.Property(() => tAlias.Course.Id), courseIds))

我需要对子集合执行子查询,但无法使其工作

我试过这个

 Task tAlias = null;
        List<Task> result = session.QueryOver<Task>(() => tAlias)
                                   .Where(Restrictions.In(Projections.Property(() => tAlias.Course.Id), courseIds))
                                   .WithSubquery.WhereExists(QueryOver.Of<CompletedTask>().Where(x => x.Student.StudentId == settings.StudentId))                                     
().ToList();
Task tAlias=null;
列表结果=session.QueryOver(()=>tAlias)
.Where(Restrictions.In(projects.Property(()=>tAlias.Course.Id),courseIds))
.with subquery.WhereExists(QueryOver.Of().Where(x=>x.Student.StudentId==settings.StudentId))
()托利斯特();
然而我得到了

无法对条件使用子查询 没有投影

session.QueryOver(()=>tAlias)
.WhereRestrictionsOn(x=>x.Course.Id).IsIn(courseIds)
.WithSubquery.WhereExists(QueryOver.Of())
.Where(x=>x.id==tAlias.id)//不确定如何将任务链接到CompletedTask
.Where(x=>x.Student.StudentId==settings.StudentId)
.Select(x=>x.id))//exists需要某种类型的投影(即Select子句)
.List();
或者如果你只想要完成的任务,那么就

Task taskAlias = null;

session.QueryOver<CompletedTask>()
    .JoinAlias(x => x.Task, () => taskAlias)
    .WhereRestrictionsOn(() => taskAlias.Course.Id).IsIn(courseIds)
    .Where(x => x.Student.StudentId == settings.StudentId)
    .List<CompletedTask>();
Task taskAlias=null;
session.QueryOver()
.JoinAlias(x=>x.Task,()=>taskAlias)
.WhereRestrictionsOn(()=>taskAlias.Course.Id).IsIn(courseIds)
.Where(x=>x.Student.StudentId==settings.StudentId)
.List();
或者考虑在Task.CompletedTasks集合上设置学生筛选器。我以前从未使用过此功能。我认为在运行查询之前,必须启用筛选器并设置student参数。那么您的任务对象将只包含该学生完成的任务


@dotjoe-我想返回整个任务对象,我也要返回(x=>x.Task)?@dotjoe-为什么我需要在id上执行where子句?为什么我需要将任务链接到completedTask。我只是希望向下查询已完成的任务,这样它就只有student.updated答案的记录。我认为这个错误只是因为WhereExists分离查询没有任何投影,即
Select()
。主查询只能
List()
您不必在exists子句中使用id。我以为你只想要学生完成的任务?如果您不将任务链接到已完成的任务,那么如果学生至少完成一项任务,您将获得所有任务。@dotjoe-我想选择整个CompletedTask对象,我该怎么做?
Task taskAlias = null;

session.QueryOver<CompletedTask>()
    .JoinAlias(x => x.Task, () => taskAlias)
    .WhereRestrictionsOn(() => taskAlias.Course.Id).IsIn(courseIds)
    .Where(x => x.Student.StudentId == settings.StudentId)
    .List<CompletedTask>();