NHibernate过滤器收集

NHibernate过滤器收集,nhibernate,filter,nhibernate-mapping,versioning,Nhibernate,Filter,Nhibernate Mapping,Versioning,我想使用NHibernate过滤类中的集合,使其仅包含可能对象的子集。下面我提供了一个示例表数据来帮助解释。我无法使用NHibernate实现这一点 表:数据对象 DataObjectId(主键)/名称/当前版本 表:DataObjectVersion Id/Comment/VersionNumber/DataObjectId(FK) 31“Genesis”1 11可能随着用户更改数据以及您试图获取最新数据,您的版本号会增加。如果你认为版本号是一个“年龄”字段(即0是最新的/最年轻的版本,1是下

我想使用NHibernate过滤类中的集合,使其仅包含可能对象的子集。下面我提供了一个示例表数据来帮助解释。我无法使用NHibernate实现这一点

表:数据对象 DataObjectId(主键)/名称/当前版本 表:DataObjectVersion Id/Comment/VersionNumber/DataObjectId(FK)
31“Genesis”1 11可能随着用户更改数据以及您试图获取最新数据,您的版本号会增加。如果你认为版本号是一个“年龄”字段(即0是最新的/最年轻的版本,1是下一个最旧的,等等),那么你的问题就变成了如何使所有实体的年龄为0。这可以使用过滤器来完成:

如果要按需过滤集合,使用过滤器是一个有效的选择。 您需要在Version类和bag元素中声明过滤器,并从NHibernateSession.EnableFilter方法应用过滤器

如果您始终希望在包中获取单个版本,则在包的映射中实现“where”:

<bag name="Versions" cascade="all-delete-orphan" inverse="true" lazy="false" where="CurrentVersionNumber = Versions.VersionNumber" >
    <key column="DataObjectId" />
    <one-to-many class="DataObjectVersion" />
</bag>
在地图中,将“袋子”替换为

<property name="Version" type="DataObjectVersion" update="false" insert="false" formula="(select v.DataObjectVersionId, v.Comments, v.VersionNumber, v.DataObjectId from DataObjectVersion v where v.VersionNumber  = CurrentVersionNumber)" />

同样,只允许使用正确的SQL

我将计算属性与本机数据类型(datetime、string等)一起使用,获取实体可能(也可能不)需要更多或不同的内容

最后但并非最不重要的一点是,通过在集合上创建筛选器,可以在获取主对象DataObject后在集合上应用筛选器

IList<DataObjectVersion>  fVersion = 
    NHibernateSession.CreateFilter(do.Versions, "where VersionNumber = :ver")
        .SetParameter("ver", do.CurrentVersionNumber)
        .List<DataObjectVersion>();
IList版本=
NHibernateSession.CreateFilter(do.Versions,“其中VersionNumber=:ver”)
.SetParameter(“版本”,do.CurrentVersionNumber)
.List();

如果do.Versions集合未初始化,则仅在单独的fVersion集合中获取结果,这是在往返数据库获取数据对象后的第二次选择。

谢谢,这很有帮助。
<bag name="Versions" cascade="all-delete-orphan" inverse="true" lazy="false" where="CurrentVersionNumber = Versions.VersionNumber" >
    <key column="DataObjectId" />
    <one-to-many class="DataObjectVersion" />
</bag>
public virtual DataObjectVersion Version { get; set; }
<property name="Version" type="DataObjectVersion" update="false" insert="false" formula="(select v.DataObjectVersionId, v.Comments, v.VersionNumber, v.DataObjectId from DataObjectVersion v where v.VersionNumber  = CurrentVersionNumber)" />
IList<DataObjectVersion>  fVersion = 
    NHibernateSession.CreateFilter(do.Versions, "where VersionNumber = :ver")
        .SetParameter("ver", do.CurrentVersionNumber)
        .List<DataObjectVersion>();