C# 使用父属性筛选集合

C# 使用父属性筛选集合,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,我想使用父类中的属性对集合集应用筛选器。 我发现我可以使用where子句进行集合—这似乎很有效—但我不确定这是否是最好的选择,或者这个解决方案是否会在将来给我带来麻烦 这是我的类顺序的映射: 这是一个Oracle遗留数据库,我无法更改它的架构。主键都是复合键 现在,我想使用一些条件获取订单,并使用OCHMAGS property WareHouseDelivery字段作为过滤器延迟加载订单行。 如您所见,我使用父表的别名在集合中定义了where子句: <set name="OrderLin

我想使用父类中的属性对集合集应用筛选器。 我发现我可以使用where子句进行集合—这似乎很有效—但我不确定这是否是最好的选择,或者这个解决方案是否会在将来给我带来麻烦

这是我的类顺序的映射:

这是一个Oracle遗留数据库,我无法更改它的架构。主键都是复合键

现在,我想使用一些条件获取订单,并使用OCHMAGS property WareHouseDelivery字段作为过滤器延迟加载订单行。 如您所见,我使用父表的别名在集合中定义了where子句:

<set name="OrderLines" ... where="OCLMAGS = this_.OCHMAGS">
PS:我渴望加载我的订单行集合:

var qry = .QueryOver<Domain.Order>()
    .Fetch(t => t.OrderLines).Eager
    .JoinAlias(t => t.OrderLines, () => orderLine, JoinType.LeftOuterJoin);

这是一个可行的解决方案吗?还有其他选择吗?

我不确定你的评论:。。。而且它似乎起作用了。。。 因为它不能工作。在集合映射的WHERE子句中不可用表示父级的。它是集合表的别名

集合与所有者分开加载。NHibernate将执行订单行表中的SELECT…:OCSALIN_NHBP。没有任何与父对象的联接。在您的案例中,WHERE子句中的参数被注入ParentId,因此键由更多列组成。就这样

一种方法是创建更复杂的WHERE子句,将父表用作subselect。当然,这在大型表上不是很有效


也许还有其他的方法,但问题是这并不是看起来的那样,我不确定你的评论:。。。而且它似乎起作用了。。。 因为它不能工作。在集合映射的WHERE子句中不可用表示父级的。它是集合表的别名

集合与所有者分开加载。NHibernate将执行订单行表中的SELECT…:OCSALIN_NHBP。没有任何与父对象的联接。在您的案例中,WHERE子句中的参数被注入ParentId,因此键由更多列组成。就这样

一种方法是创建更复杂的WHERE子句,将父表用作subselect。当然,这在大型表上不是很有效


也许还有其他的方法,但这不是看起来的半径,谢谢你的帮助。我已经用更多的信息更新了我的问题,请看图片和c查询,它确实有效。当然这是一个技巧。你认为我应该使用吗?过滤器的问题是,它是基于会话的。因此,它与父项无关。我正在使用过滤器,如果我想过滤基于文化的元素,它做得很好。然后我设置过滤器:Culture==cs,并且只选择具有此条件的项。我们需要的是,我会说有点不同。我们需要根据父对象的某些属性进行筛选,对于每个父对象,这些属性可能位于不同的列表中。因此,这可能只适用于选择一个父记录及其集合。我知道,答案可能不太好……我刚刚读了你的更新。在这种情况下,它可以工作,但如果其他人在不急于加载的情况下执行不同的查询,这是危险的。但以防万一,渴望的人就在那里。。。另一方面,我要说的是,最好是暂时停止我们的工作。试想一下,如果您无法在订单项表中以某种方式放置标记IsActive。。。然后是caluse将工作的地方Radim,谢谢你的帮助。我已经用更多的信息更新了我的问题,请看图片和c查询,它确实有效。当然这是一个技巧。你认为我应该使用吗?过滤器的问题是,它是基于会话的。因此,它与父项无关。我正在使用过滤器,如果我想过滤基于文化的元素,它做得很好。然后我设置过滤器:Culture==cs,并且只选择具有此条件的项。我们需要的是,我会说有点不同。我们需要根据父对象的某些属性进行筛选,对于每个父对象,这些属性可能位于不同的列表中。因此,这可能只适用于选择一个父记录及其集合。我知道,答案可能不太好……我刚刚读了你的更新。在这种情况下,它可以工作,但如果其他人在不急于加载的情况下执行不同的查询,这是危险的。但以防万一,渴望的人就在那里。。。另一方面,我要说的是,最好是暂时停止我们的工作。试想一下,如果您无法在订单项表中以某种方式放置标记IsActive。。。然后是caluse工作的地方
<set name="OrderLines" ... where="OCLMAGS = this_.OCHMAGS">
var qry = .QueryOver<Domain.Order>()
    .Fetch(t => t.OrderLines).Eager
    .JoinAlias(t => t.OrderLines, () => orderLine, JoinType.LeftOuterJoin);
  <set ...
    where="OCLMAGS IN 
      (SELECT p.OCLMAGS FROM OCSAORH_NHBP p WHERE p.OCLORDN = OCLORDN...)" >