3

我目前正在构建一个留言板,我需要在其中输出线程中的消息数量。

  • ID
  • 姓名
  • 消息计数

在普通 SQL 中,它看起来像这样,但我找不到任何关于如何制作inline select.

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

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

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

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

4

1 回答 1

6

您可以使用投影来执行此操作。在 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)

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

于 2011-09-06T12:23:59.330 回答