C# 具有部分子集合的NHibernate加载实体

C# 具有部分子集合的NHibernate加载实体,c#,nhibernate,C#,Nhibernate,是否有方法加载NHibernate实体,并在子集合上加载子句?我有一个场景,我在“操作”中记录更改,即一个操作可以包含对多个实体的更改。当我想加载特定实体的日志时,我会加载对该实体所做任何更改的所有操作。加载这些操作会导致加载所有更改-我只希望加载相关的更改 课程: public class Operation{ public virtual DateTime TimeStamp { get; set; } public virtual IList<Change> Cha

是否有方法加载NHibernate实体,并在子集合上加载子句?我有一个场景,我在“操作”中记录更改,即一个操作可以包含对多个实体的更改。当我想加载特定实体的日志时,我会加载对该实体所做任何更改的所有操作。加载这些操作会导致加载所有更改-我只希望加载相关的更改

课程:

public class Operation{
   public virtual DateTime TimeStamp { get; set; }
   public virtual IList<Change> Changes { get; private set; }
}

public class Change{
    public virtual string ChangeText { get; set; }
    public virtual int EntityId { get; set; }
} 
公共类操作{
公共虚拟日期时间时间戳{get;set;}
公共虚拟IList更改{get;private set;}
}
公共阶级变革{
公共虚拟字符串ChangeText{get;set;}
公共虚拟int EntityId{get;set;}
} 
获取给定实体的操作

 Session.QueryOver<Operation>().Where(o => o.Changes.Any(c => c.EntityId == entityId));
Session.QueryOver()。其中(o=>o.Changes.Any(c=>c.EntityId==EntityId));

I.正如Oskar Berggren的回答所述: 您可以应用过滤器

总结:

调整映射

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

我喜欢选项II,但最后一个选项中的“c”是更改的集合,而不是每个更改项。。。看起来它必须类似于
Where(cl=>cl.Where(c=>c.EntityId==EntityId))
,但是这当前给了我一个编译错误..
session.QueryOver().JoinQueryOver(o=>o.Changes).Where(c=>c.EntityId==EntityId)给了我一个编译器错误,因为c是IList类型,而不是change,我更新了答案。JoinQueryOver应配备
。现在它应该可以工作了。更多信息和详细信息可在文档中找到:
ISession session = ...;
session.EnableFilter("myFilter").SetParameter("myFilterParam", "some-value");
IList results = Session.QueryOver<Operation>()
  .Where(...
  .List();
IQueryOver<Operation,Change> query =
 session.QueryOver<Operation>()
   .JoinQueryOver<Change>(o => o.Changes) // added explicit <Change>
     .Where(c => c.EntityId == entityId);