NHibernate Collection子查询

时间:2015-07-22 21:32:54

标签: c# nhibernate nhibernate-mapping

有没有办法为NHibernate的映射添加条件?

public class Course {
   public IList<Participant> Participants { get; set; }
   public IList<Participant> ActiveParticipants { get; set; }
}

第二个属性,ActiveParticipants应该是其“状态”设置为“活动”的参与者列表。否则,有没有办法对该类进行后期处理,但仍然保持延迟加载,因为有时不会使用“ActiveParticipants”属性。

它需要像这样而不是使用LINQ的原因是将类注入到动态“Mustache”模板中,该模板仅适用于标准属性。还有几个类似的属性。

3 个答案:

答案 0 :(得分:1)

如果你有参与者的子类,其状态是DiscriminatorValue,我认为你可以将它们作为单独的列表,因为这样nHibernate知道如何区分它们。

public class ParticipantMap : ClassMap<Participant>
{
    public ParticipantMap()
    {
        DiscriminateSubClassesOnColumn("Status");
    }
}
public class ActiveParticipantMap : SubclassMap<ActiveParticipant>
{
    public ActiveParticipantMap ()
    {
        DiscriminatorValue("Active");
    }
}
// other subclasses of participant e.g. NonActive, etc.

public class Course {
    public IList<Participant> Participants {get;set;}
    public IList<ActiveParticipant> ActiveParticipants {get;set;}
    // any other lists of participant subclasses that you may have
}

答案 1 :(得分:1)

看来,在这种情况下,我们需要“动态”过滤。映射的集合有时包含所有记录,有时只包含符合某些过滤条件的记录。

正是为此,我们有:

18.1. NHibernate filters

  

NHibernate增加了预定义过滤条件的能力,并在类和集合级别附加这些过滤器。过滤条件是能够定义与类和各种集合元素上现有的“where”属性非常相似的限制子句。除了这些过滤条件可以参数化。然后,应用程序可以在运行时决定是否应该启用给定的过滤器以及它们的参数值应该是什么。过滤器可以像数据库视图一样使用,但在应用程序内部进行参数化。

     

为了使用过滤器,必须首先定义它们,然后将它们附加到适当的映射元素。要定义过滤器,请使用元素中的元素:

<filter-def name="myFilter">
    <filter-param name="myFilterParam" type="String"/>
</filter-def>
  

然后,此过滤器可以附加到类:

<class name="MyClass" ...>
    ...
    <filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
</class>
  

或者,到一个集合:

<set ...>
    <filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
</set>

在此处查看更多详细信息(xml)

(流利的映射)

答案 2 :(得分:0)

您不需要子查询来加载具有附加条件的集合。

HasMany(x => x.ActiveParticipants).Where("Status = 'Active'");