NHibernate JoinQueryOver TransformUsing创建了笛卡儿

时间:2013-10-27 12:55:48

标签: nhibernate

在我的NHibernate映射中:

(1)'个人'包含姓名,地址,电话和注册的集合。 (2)'Enrollments'包含CourseOfferings,Statuses和Flags的集合。

以下内容返回包含注册和标志的多个结果(笛卡儿)的结果。最高级别(即个人)是不同的。

            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)

非常感谢任何帮助。

提前致谢, Dharmesh

2 个答案:

答案 0 :(得分:0)

这不是理想的,但你可以使用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();

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

答案 1 :(得分:0)

我最终使用了Future&lt;&gt;查询。谢谢大家的帮助。