如何在Nhibernate中进行子查询? [英] How to do subqueries in nhibernate?
问题描述
我需要对子集合进行子查询,但无法正常工作.
I need to do a subquery on a sub collection but I can't get it to work.
我尝试过
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();
我明白了
不能在条件上使用子查询 没有投影.
Cannot use subqueries on a criteria without a projection.
推荐答案
session.QueryOver<Task>(() => tAlias)
.WhereRestrictionsOn(x => x.Course.Id).IsIn(courseIds)
.WithSubquery.WhereExists(QueryOver.Of<CompletedTask>()
.Where(x => x.id == tAlias.id) //not sure how you need to link Task to CompletedTask
.Where(x => x.Student.StudentId == settings.StudentId)
.Select(x => x.id)) //exists requires some kind of projection (i.e. select clause)
.List<Task>();
或者,如果您只想要完成的任务,那么...
or if you only want the completedtask then just...
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.CompletedTasks集合上设置学生过滤器.我以前从未使用过此功能.我相信您必须在运行查询之前启用过滤器并设置学生参数.然后您的Task对象将只包含该学生完成的Tasks ...
or look into setting up a student filter on the Task.CompletedTasks collection. I've never used this feature before. I believe you have to enable the filter and set the student parameter before you run the query. Then your Task object would only contain completedTasks by that student...
http://nhibernate.info/doc/nh/en/index. html#filters
这篇关于如何在Nhibernate中进行子查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!