NHibernate JoinQueryOver变换使用笛卡尔

NHibernate JoinQueryOver变换使用笛卡尔,nhibernate,Nhibernate,在我的NHibernate映射中: (1) “个人”包含姓名、地址、电话和注册信息的集合。 (2) “注册”包含课程成绩、状态和旗帜的集合 下面返回包含注册和标志的多个结果(笛卡尔)的结果。但顶层(即个人)是不同的 var query = session.QueryOver<Individual>() .Left.JoinAlias(i => i.Names, () => name) .Left.Jo

在我的NHibernate映射中:

(1) “个人”包含姓名、地址、电话和注册信息的集合。 (2) “注册”包含课程成绩、状态和旗帜的集合

下面返回包含注册和标志的多个结果(笛卡尔)的结果。但顶层(即个人)是不同的

            var query = session.QueryOver<Individual>()
            .Left.JoinAlias(i => i.Names, () => name)
            .Left.JoinAlias(i => i.Addresses, () => address)
            .Left.JoinAlias(i => i.Phones, () => phone)
            .Where(i => name.ToDate == null)
            .Where(i => phone.ToDate == null)
            .Where(i => address.ToDate == null)
            .Where(i=>i.ContactId ==748)
            .OrderBy(Projections.Property(() => name.NameOther)).Asc
             .Left.JoinQueryOver(i => i.Enrolments, () => enrolment)
            .Left.JoinAlias(s => s.Statuses, () => status)
            .Left.JoinAlias(s => s.CourseOffering, () => courseOffering)
            .Left.JoinAlias(s => s.Flags, () => flag)
            .Where(s => status.ToDate == null)
            .Where(s => flag.ToDate == null)
            //.TransformUsing(Transformers.AliasToBean<StudentEnrolment>())
             .TransformUsing(Transformers.DistinctRootEntity)
var query=session.QueryOver()
.Left.JoinAlias(i=>i.Names,()=>name)
.Left.JoinAlias(i=>i.Addresses,()=>address)
.Left.JoinAlias(i=>i.Phones,()=>phone)
.Where(i=>name.ToDate==null)
.Where(i=>phone.ToDate==null)
.Where(i=>address.ToDate==null)
.其中(i=>i.ContactId==748)
.OrderBy(Projections.Property(()=>name.NameOther)).Asc
.左.联合查询(i=>i.注册人数,()=>注册人数)
.Left.JoinAlias(s=>s.status,()=>status)
.Left.JoinAlias(s=>s.CourseOffering,()=>CourseOffering)
.Left.JoinAlias(s=>s.Flags,()=>flag)
.Where(s=>status.ToDate==null)
.Where(s=>flag.ToDate==null)
//.TransformUsing(Transformers.AliasToBean())
.变压器使用(变压器.距离)
非常感谢您的帮助

提前感谢,,
Dharmesh

这并不理想,但您可以使用id上的投影和子查询使其工作:

var subQuery = QueryOver.Of<Individual>()
            ... add all your restrictions ...
            .Select(i => i.Id);

var results = session.QueryOver<Individual>()
              .WithSubquery.WhereProperty(i => i.Id).In(subQuery)
              .List();
var subQuery=QueryOver.Of()
... 添加所有限制。。。
.选择(i=>i.Id);
var results=session.QueryOver()
.WithSubquery.WhereProperty(i=>i.Id).In(子查询)
.List();

然后,结果应该包含具有正确集合的实体列表(延迟加载,除非您另有指定)

我最终使用了未来的查询。感谢大家的帮助。

我认为这是一个已知的缺陷/问题,它具有
差异性
和深度连接多个关系。我会试着找些正式的,非常感谢安德鲁。我绝望地等待着某种解决办法。再次感谢。可能是因为OrderBy子句的缘故-如果列表不是很大,您可以在从数据库检索后使用Linq对其进行排序。错误显示“查询无法执行”。因此,生成的SQL是错误的。