我已经创建了一个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来实现这个目标?
答案 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")));