Как сделать подзапросы в nhibernate? - PullRequest
14 голосов
/ 11 мая 2011

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

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

 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 Ответ

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

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

...