我正在尝试将以下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。)但我看不出最好的方法是什么。我感谢任何帮助!
提前致谢!
答案 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以获取更多提示