Как выполнить подзапросы в nhibernate?

Мне нужно сделать подзапрос в подкатегории, но я не могу заставить его работать.

Я пробовал это

 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();

Но я получаю

Невозможно использовать подзапросы по критерию без проекции.

Ответы

Ответ 1

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>();

или если вы хотите только заполненную область, то просто...

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. Я никогда раньше не использовал эту функцию. Я считаю, что вы должны включить фильтр и установить параметр student перед запуском запроса. Тогда ваш объект Task будет содержать только завершенные задания этого студента...

http://nhibernate.info/doc/nh/en/index.html#filters