如何从NHibernate中的子查询中获取值?`

时间:2011-09-06 10:07:25

标签: nhibernate nhibernate-criteria

我正在构建一个留言板,我需要输出一个Thread中的消息数。

  • ID
  • 名称
  • MessageCount

在纯SQL中,它看起来像这样,但我找不到任何关于如何制作inline select的文档。

SELECT 
t.ID, 
t.Name 
(SELECT COUNT(*) FROM Messages m WHERE m.ThreadID = t.ID)
FROM Threads t 

我只找到了如何使用分离查询来限制结果集的示例,而不是如何从中选择实际值。

如何使用NHibernate进行内联选择?我更喜欢使用ICriteria而不是HQL。

编辑:我简化了过于复杂的问题,以便更容易理解。

1 个答案:

答案 0 :(得分:5)

您可以使用投影来执行此操作。在3.X中使用QueryOver API它看起来像这样(在你的情况下子查询将是不同的,但不是太远):

    var subquery = DetachedCriteria.For<ToppingUse> ("t")
            .Add (Restrictions.EqProperty ("t.Pizza.Id", "p.Id"))
            .SetProjection (Projections.Count ("Id"));

    Pizza p = null;

    var toppedPizzas = session.QueryOver<Pizza>(() => p)
        .Select(Projections.Property(() => p.Id)
            , Projections.Property(() => p.Sauce)
            , Projections.Property(() => p.Crust)
            , Projections.Alias(Projections.SubQuery(subquery), "ToppingCount"))
        .List<object[]>(); //then you need to handle mapping on your own somehow (look into ResultTransformers if needed)

这转换为以下标准:

    var subquery = DetachedCriteria.For<ToppingUse> ("t")
            .Add (Restrictions.EqProperty ("t.Pizza.Id", "p.Id"))
            .SetProjection (Projections.Count ("Id"));

    var toppedPizzas = session.CreateCriteria<Pizza>("p")
        .SetProjection(Projections.Property("p.Id")
            , Projections.Property("p.Sauce")
            , Projections.Property("p.Crust")
            , Projections.Alias(Projections.SubQuery(subquery), "ToppingCount"))
        .List<object[]>();//then you need to handle mapping on your own somehow (look into ResultTransformers if needed)

您只需要确保在子查询和外部查询中使用相同的别名。