C# 将SQL转换为Fetchplan的NHibernate Fluent语法

C# 将SQL转换为Fetchplan的NHibernate Fluent语法,c#,nhibernate,queryover,C#,Nhibernate,Queryover,我如何用fetchplan的流利nhibernate语法表达以下内容 select * from Person a where ( (Male = 0) or ((Male = 1) and exists (select * from Staff where PersonId = XXX and EmployeeId = YYY)) ) and PersonId = XXX 我能处理的最好的就是这个,但它甚至不能编译 Person pers = null; Staff s = null;

我如何用fetchplan的流利nhibernate语法表达以下内容

select *
from Person a
where 
(
 (Male = 0) or
 ((Male = 1) and exists (select * from Staff where PersonId = XXX and EmployeeId = YYY))
)
and PersonId = XXX
我能处理的最好的就是这个,但它甚至不能编译

Person pers = null;
Staff s = null;

var subquery = QueryOver.Of<Staff>(() => s)
                        .Where(() => s.Employee.Id == YYY)
                        .And(() => s.Person.Id == XXX);

var query = session.QueryOver<Person>()
                   .Where(NHibernate.Criterion.Restrictions.Disjunction()
                   .Add(Subqueries.WhereProperty<Person>(a => !a.Male))
                   .Add(Subqueries.WhereProperty<Person>(a => a.Male))
                   .Add(Subqueries.WhereExists(subquery)))
                   .Where(() => pers.Id == XXX);
Person pers=null;
Staff s=null;
var subquery=QueryOver.Of(()=>s)
.Where(()=>s.Employee.Id==YYY)
和(()=>s.Person.Id==XXX);
var query=session.QueryOver()
.Where(NHibernate.criteria.Restrictions.Disjunction()
.Add(子查询.WhereProperty(a=>!a.Male))
.Add(子查询.WhereProperty(a=>a.Male))
.Add(子查询.WhereExists(子查询)))
其中(()=>pers.Id==XXX);

QueryOver语法应如下所示:

Person pers = null;
Staff s = null;

var subquery = QueryOver
    .Of<Staff>(() => s)
    .Where(() => s.Employee.Id == YYY)
    .And(() => s.Person.Id == XXX)
    // any SELECT clause, including the sub select, must return something
    .Select(sub => sub.Id)
    ;

var query = session
    // let's use alias we've already declared above
    .QueryOver<Person>(() => pers)

    // the first condition
    .Where(

        // let's simplify the stuff 
        // instead of:   (IsMale OR (!IsMale AND exists)
        // use the same: (IsMale OR exists)

        Restrictions.Disjunction()
            .Add(() => pers.Male)  // alias pers
            .Add(Subqueries.Exists(subquery.DetachedCriteria))
    )
    // the second top level condition
    .And(() => pers.ID == XXX) // alias pers
    ;
Person pers=null;
Staff s=null;
var subquery=QueryOver
.Of(()=>s)
.Where(()=>s.Employee.Id==YYY)
.和(()=>s.Person.Id==XXX)
//任何SELECT子句(包括子SELECT)都必须返回某些内容
.选择(sub=>sub.Id)
;
var query=会话
//让我们使用上面已经声明的别名
.QueryOver(()=>pers)
//第一个条件
.在哪里(
//让我们简化一下
//而不是:(IsMale或(!IsMale AND exists)
//使用相同的:(IsMale或exists)
限制。析取()
.Add(()=>pers.Male)//别名pers
.Add(subquerys.Exists(subquery.DetachedCriteria))
)
//第二个顶级条件
.和(()=>pers.ID==XXX)//别名pers
;

现在,
query.List().SingleOrDefault()
应该返回Male或Staff guy。

PersonId不是该表的主键吗?如果是,则似乎Male=0或Male=1是不相关的。就是这样,感谢您的帮助。ThanksGreat如果有帮助,请享受NHibernate:)