NHibernate - 如何使用带有关联路径的投影来限制结果集?

时间:2011-04-27 18:24:35

标签: c# .net nhibernate

我已经创建了一个Fluent NHibernate约定来将'Join'设置为所有多对一关联的提取模式(在我看来,发送选择每个获取1条记录没有意义)。问题是一些实体有大量的列(遗留数据库),我需要限制我正在创建的报告的结果集。

考虑以下示例:

class X 
{
  public int Id {get;set;}
  public virtual Y RefToY {get;set;}
  ...
}

class Y
{
  public int Id {get;set;}
  public virtual Z RefToZ {get;set;}
  ...
}

class Z
{
  public int Id {get;set;}
  public virtual String data1 {get;set;}
  public virtual String data2 {get;set;}
  public virtual String data3 {get;set;}
  ...
}

想象一下,除了我展示的属性之外,这些实体中的每一个都有200多个属性,每个属性都映射到一列。

假设我需要创建的报告基于X(意味着标准基于X),我需要获取X的'Id'属性和Z的'data1','data2'和'data3'属性在DataGrid上显示。 获取600列的结果集没有意义,因此我需要使用Criteria API指定我只需要这4列。我怎样才能快速完成呢?我试过设置这样的预测:

var crit = Session.CreateCriteria<X>().SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Id"))
.Add(Projections.Property("RefToY.RefToZ.data1"))
.Add(Projections.Property("RefToY.RefToZ.data2"))
.Add(Projections.Property("RefToY.RefToZ.data3")));

但这导致错误说:“RefToY.RefToZ.data1”......属性不存在。这导致了我的问题。我如何使用NHibernate标准API来实现这个目标?

1 个答案:

答案 0 :(得分:4)

您需要为条件添加联接。试一试......

var crit = Session.CreateCriteria<X>()
    .CreateAlias("RefToY", "y")
    .CreateAlias("y.RefToZ", "z")
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Id"))
        .Add(Projections.Property("z.data1"))
        .Add(Projections.Property("z.data2"))
        .Add(Projections.Property("z.data3")));