Nhibernate 具有QueryOver的多个子查询

Nhibernate 具有QueryOver的多个子查询,nhibernate,queryover,Nhibernate,Queryover,我需要帮助将此sql查询转换为QueryOver Nhibernate条件 select distinct * from event e where e.name like '%req%' or e.Id in (select r.eventId from requirement r where r.name like '%req%') or e.Id in (select r.eventId from requirement r where r.id in (select s.requi

我需要帮助将此sql查询转换为QueryOver Nhibernate条件

select distinct * from event e where e.name like '%req%' 
or e.Id in (select r.eventId from requirement r where r.name like '%req%') 
or e.Id in (select r.eventId from requirement r where r.id 
in (select s.requirementId from solution s where s.name like '%sol%'))

var queryOver = session.QueryOver<Event>()
                       .Where(x => x.Name.IsInsensitiveLike("%"+searchTerms[1]+"%"))
                       .OrderBy(x => x.CreatedOn).Asc;
到目前为止,我有主查询,但找不到足够的关于如何添加子查询的参考资料。尚未成功使用joinQueryOver

事件与需求有一对多关系,需求与解决方案有一对多关系

  Requirement reqAlias = null;
  Solution solAlias = null;

  var subQuery = QueryOver.Of<Event>()                                
      .JoinAlias(x => x.Requirements, () => reqAlias)
      .Where(x => x.Name.IsInsensitiveLike(searchTerms[2]))
      .JoinAlias(() => reqAlias.Solutions, () => solAlias)
      .Where(x => x.Name.IsInsensitiveLike(searchTerms[3]))
      .Select(Projections.Group<Event>(x => x.Id));

  var events = session.QueryOver<Event>()
      .Where(x => x.Name.IsInsensitiveLike(searchTerms[1]))
      .WithSubquery.WhereProperty(x => x.Id).In(subQuery)
      .List().ToList();
仍然不起作用。

当您使用IsInsensitiveLike NHibernate时,在解析后附加%并使用lower进行小写比较。在您的代码中,您自己添加了%1,这会导致

select distinct * from event e where e.name like %lower('%req%')%
这反过来也不起作用

此外,您有3个子查询,不是一个大的子查询,因此您需要重新构造代码以解决这一问题:

select r.eventId from requirement r where r.name like '%req%'


然后您需要使用限制来构造主查询。或者包含这3个查询。

rae1n请查看上面的内容。我根据你的建议编辑了这个查询,但仍然不走运。我想我很难弄清楚是否包含子查询。如果涉及两个以上的表,您能给我举个例子说明如何编写子查询吗?谢谢,rae1n!这很有魅力。我不得不用HQL来做机翼,直到我有时间再做。。。
var firstQuery = QueryOver.Of<Requirement>()                                
                          .Where(r => r.Name.IsInsensitiveLike(searchTerms[2]))
                          .Select(r => r.EventId);
select s.requirementId from solution s where s.name like '%sol%'
var solutionQuery = QueryOver.Of<Solution>()                                
                           .Where(s => s.Name.IsInsensitiveLike(searchTerms[3]));
select r.eventId from requirement r where r.id 
in (select s.requirementId from solution s where s.name like '%sol%')
var requirementQuery = QueryOver.Of<Requirement>()
                                .WithSubquery
                                .WhereProperty(r => r.Id).In(solutionQuery)
                                .Select(r => r.EventId);