NHibernate:Criteria / SubCriteria Projection

我有一个类Mod,它有一个成员:

ICollection EventList 

类Event有一个成员:

 public virtual EventType Type { get; set; } 

EvenType类有成员:

  public virtual int Id 

我想使用NHibernate Criteria获取Mod中所有事件的列表,其中id为1或2。 我这样做了:

 var subCriteria = DetachedCriteria.For() .Add(Restrictions.In("Event.Type", new int[] {1, 2 }) ); criteria.Add(Subqueries.Exists(subCriteria)); 

但我得到一个运行时错误,说不能在没有投影的条件下使用子查询。

所以,很好,但我不知道投影的内容。 我可以找到如何进行预测的示例,但没有任何真正解释目的的内容。 我尝试过各种各样的东西,但都会导致运行时错误:

消息:值不能为空。 参数名称:key来源:mscorlib帮助链接:ParamName:key

我需要使用子查询,因为当这个工作时我会添加更多。

你能建议怎么做投影吗?

如下所述: 16.4。 关联可以这样做:

 IQueryOver query = session .QueryOver() .JoinQueryOver(mod => mod.EventList) .WhereRestrictionOn(evnt => evnt.Type.Id).IsIn(new object[] { 1, 2}); var result = query.List(); 

编辑:纯Criteria API:

 var criteria = session.CreateCriteria(); var sub = criteria.CreateCriteria("EventList", JoinType.LeftOuterJoin); sub.Add(new InExpression("Type", new object[] { 1, 2 })); var result = criteria.List(); 

使用分离标准。 在这种情况下, EventType必须具有属性ModId或引用Mod实例。 在子查询中,我们必须返回有效Mod.ID列表

 var sub = DetachedCriteria .For() .Add(Restrictions.In("Type", new int[] {1, 2 })) // WHERE .SetProjection(Projections.Property("ModId")); // Mod.ID the SELECT clause var criteria = session.CreateCriteria(); criteria.Add(Subqueries.PropertyIn("ID", sub)); // Mod.ID in (select var result = criteria.List();