我正在构建一个留言板,我需要输出一个Thread中的消息数。
在纯SQL中,它看起来像这样,但我找不到任何关于如何制作inline select
的文档。
SELECT
t.ID,
t.Name
(SELECT COUNT(*) FROM Messages m WHERE m.ThreadID = t.ID)
FROM Threads t
我只找到了如何使用分离查询来限制结果集的示例,而不是如何从中选择实际值。
如何使用NHibernate进行内联选择?我更喜欢使用ICriteria而不是HQL。
编辑:我简化了过于复杂的问题,以便更容易理解。
答案 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)
您只需要确保在子查询和外部查询中使用相同的别名。