Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate-如何使用具有关联路径的投影来限制结果集?_C#_.net_Nhibernate - Fatal编程技术网

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

C# NHibernate-如何使用具有关联路径的投影来限制结果集?,c#,.net,nhibernate,C#,.net,Nhibernate,我已经创建了一个流畅的NHibernate约定,将“Join”设置为所有多对一关联的获取模式(在我看来,没有必要发送选择来获取每个记录)。问题是一些实体有大量的列(遗留数据库),我需要限制我正在创建的报告的结果集 考虑以下示例: class X { public int Id {get;set;} public virtual Y RefToY {get;set;} ... } class Y { public int Id {get;set;} public virtu

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

考虑以下示例:

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列的resultset没有意义,因此我需要使用CriteriaAPI指定我只需要这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")));
var crit=Session.CreateCriteria().SetProjection(Projections.ProjectionList()项目)
.Add(Projections.Property(“Id”))
.Add(projects.Property(“RefToY.RefToZ.data1”))
.Add(projects.Property(“RefToY.RefToZ.data2”))
.Add(projects.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")));
var crit=Session.CreateCriteria()
.CreateAlias(“参考玩具”、“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”));

您需要将联接添加到条件中。试试这个

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")));
var crit=Session.CreateCriteria()
.CreateAlias(“参考玩具”、“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”));