NH QueryOver - 在子查询中使用主查询的属性

时间:2014-09-29 06:41:36

标签: c# .net nhibernate queryover nhibernate-criteria

我正在尝试将以下SQL转换为QueryOver:

Select 1 
From myTable mt 
Where mt.ForeignKey in (select ID from otherTable ot where ot.ID = R.ID)

我想在EXISTS / NOT EXISTS语句中使用此子查询,如:

select * from table R where .... AND EXISTS (query above)

目前我有类似的东西:

mainQuery.WithSubquery.WhereExists(QueryOver.Of<myTable>()
                    .Where(mt => mt.ForeignKey)
                    .WithSubquery.IsIn(QueryOver.Of<otherTable>().Where(c => c.Id == R.SomeId)));

我创建此查询作为子查询,我想连接到主查询。 问题是,别名为R的表是主查询调用的表,我不知道如何访问表的列(NHibernate Model)R(在上面的查询中不可访问),所以我的问题是:

如何从主查询中获取值并在子查询中使用它们。我认为这只能通过内联创建子查询来实现(如在mainQuery.WithSubquery.Where(..)或类似的smth。)但我看不出最好的方法是什么。我感谢任何帮助!

提前致谢!

1 个答案:

答案 0 :(得分:1)

诀窍是为父查询使用正确的别名:

// the alias
myTable R = null;

mainQuery
    .WithSubquery
       .WhereExists(QueryOver
         .Of<myTable>( () => R) // the Alias in place
         .Where(mt => mt.ForeignKey)
         .WithSubquery.IsIn(QueryOver.Of<otherTable>().Where(c => c.Id == R.SomeId)));

注意,不完全确定mainQuery部分,但一般的解决方案是这样的:

// I. the outer query ALIAS
Employee emplyoee = null;

// II. the subquery - using the alias
var subQuery = QueryOver.Of<Contact>()
    .Select(x => x.ID)
    .Where(x => x.Related.ID == emplyoee.ID); // use alias

// III. declare the outer query and use the above alias
var query = session.QueryOver<Employee>(() => emplyoee) // declare alias
    .WithSubquery
        .WhereExists(subQuery); // put both together

另请查看this以获取更多提示