14

サブコレクションに対してサブクエリを実行する必要がありますが、それを機能させることができません。

私はこれを試しました

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

それでも私は得る

プロジェクションのない基準でサブクエリを使用することはできません。

4

1 に答える 1

25
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 コレクションに学生フィルターを設定することを検討してください。私はこれまでこの機能を使用したことがありません。クエリを実行する前に、フィルターを有効にして学生パラメーターを設定する必要があると思います。次に、あなたの Task オブジェクトには、その学生による completedTasks のみが含まれます...

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

于 2011-05-11T19:45:18.220 に答える