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



我创建了一个Fluent NHibernate约定,将'Join'设置为所有多对一关联的获取模式(在我看来,发送select来每个获取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来完成这个?

您需要向标准添加一个连接。试一试……

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")));

最新更新