【问题标题】:NHibernate Criteria and ProjectionsNHibernate 标准和预测
【发布时间】:2013-01-14 00:22:29
【问题描述】:

我的实体如下:

(1) 课程(附详情) (2) 学生(附详细资料) (3) StudentEnrolment(学生到课程的一对多映射)

现在我正在尝试创建一个投影类(称为 CourseSummary),其中包含课程的几个字段以及该课程中的学生总数(称为 TotalEnrolments)。在下面的代码中,我也包含了课程的校园(尽管与我的问题无关)。

我已经到了这里:

                var courseSummaries = session.CreateCriteria<Course>()
               .CreateAlias("Campus", "cmp")
               .SetProjection(Projections.ProjectionList()
                                  .Add(Projections.Property("CourseId"), "CourseId")
                                  .Add(Projections.Property("StartDate"), "StartDate")
                                  .Add(Projections.Property("EndDate"), "EndDate")
                                  .Add(Projections.Property("cmp.CampusId"), "CampusId")
                                 //What here for "TotalEnrolments"?
                                  ).SetResultTransformer(Transformers.AliasToBean<Course>())
               .List<Course>();

但是我应该如何加入 StudentEnrolment 类并从中获取相关记录的总数?

我是 NHibernate 世界的新手,因此我的问题可能是非常初步的。

谢谢

【问题讨论】:

    标签: nhibernate nhibernate-criteria


    【解决方案1】:
    var courseSummaries = session.CreateCriteria<Course>("c")
           .CreateAlias("Campus", "cmp")
           .SetProjection(Projections.ProjectionList()
               .Add(Projections.Property("CourseId"), "CourseId")
               .Add(Projections.Property("StartDate"), "StartDate")
               .Add(Projections.Property("EndDate"), "EndDate")
               .Add(Projections.Property("cmp.CampusId"), "CampusId")
               .Add(Projections.Subquery(DetachedCriteria.For<Student>()
                   .Add(Restriction.Eq("Course.Id", "c.Id"))
                   .SetProjections(Projections.RowCount()), "TotalStudents")
           )
           .SetResultTransformer(Transformers.AliasToBean<CourseSummary>())
           .List<CourseSummary>();
    

    【讨论】:

    • 您好 Firo,首先非常感谢您的回答。我几乎确信没有人会对我的问题感兴趣。但是,我不明白 ".Add(Restriction.Eq("Course.Id", "c.Id"))。我根本不需要 StudentEnrolment 表吗?
    • hmm 再次阅读后,我想我不了解表和类结构。可以贴一下class Course、Student和StudentEnrolment的相关部分吗?然后我会更新我的答案
    • 再次感谢 Firo,我设法根据您的建议解决了这个问题。
    【解决方案2】:

    经过 Firo 的回答并自己做了一些调整后,我解决了如下问题:

    var courseSummaries = session.CreateCriteria<Course>("c")
       .CreateAlias("Campus", "cmp")
       .SetProjection(Projections.ProjectionList()
           .Add(Projections.Property("CourseId"), "CourseId")
           .Add(Projections.Property("StartDate"), "StartDate")
           .Add(Projections.Property("EndDate"), "EndDate")
           .Add(Projections.Property("cmp.CampusId"), "CampusId")
           .Add(Projections.Subquery(DetachedCriteria.For<StudentEnrolment>("s")
               .Add(Restriction.EqProperty("s.Course.CourseId", "c.CourseId"))
               .SetProjections(Projections.RowCount()), "TotalStudents")
       )
       .SetResultTransformer(Transformers.AliasToBean<CourseSummary>())
       .List<CourseSummary>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      相关资源
      最近更新 更多