【问题标题】:NHibernate: Criteria/SubCriteria ProjectionNHibernate:标准/子标准投影
【发布时间】:2012-12-20 14:08:12
【问题描述】:

我有一个类 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));

但我收到运行时错误提示 不能在没有投影的条件上使用子查询。

所以,很好,但我不知道该为 Projection 放什么。我可以找到如何进行投影的示例,但没有什么能真正解释其目的。我尝试了各种方法,但都导致运行时错误:

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

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

您能建议如何为 Projection 做些什么吗?

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    如此处所述: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.ID 的列表

    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>();
    

    【讨论】:

    • Radim,谢谢您的回复。不过,我确实需要使用条件查询。
    • QueryOver 位于 Criteria API 之上...“QueryOver api,它结合了扩展方法和 Lambda 表达式的使用......以提供一个围绕 ICriteria API 的静态类型安全包装器”我>
    • 再次感谢您。我的问题是关于投影。我已经有一个条件实例,所以我不能像你的第二个示例那样创建另一个,或者至少必须将该条件添加到现有条件中。
    • 我编辑了答案,提供了如何解决投影问题的信息。您将需要 ModId 才能在 EventType... 上使用以履行 IN 子句
    • 非常感谢,这回答了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-07-21
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多