NHibernate:Criteria / SubCriteria Projection

时间:2012-12-20 14:08:12

标签: c# nhibernate

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

ICollection<Event> EventList

类Event有一个成员:

public virtual EventType Type { get; set; }

EvenType类有成员:

   public virtual int Id

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

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

但我收到运行时错误说 如果没有投影,则无法在标准上使用子查询。

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

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

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

你能建议怎么做投影吗?

1 个答案:

答案 0 :(得分:7)

如此处所述:16.4. Associations可以这样做:

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

var result = query.List<Mod>();

编辑:纯Criteria API:

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

var result = criteria.List<Mod>();

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

var sub = DetachedCriteria
 .For<Event>()
 .Add(Restrictions.In("Type", new int[] {1, 2 })) // WHERE
 .SetProjection(Projections.Property("ModId")); // Mod.ID the SELECT clause

var criteria = session.CreateCriteria<Mod>();
criteria.Add(Subqueries.PropertyIn("ID", sub)); // Mod.ID in (select
var result = criteria.List<Mod>();