【问题标题】:How to get the value from a subquery in NHibernate?`如何从 NHibernate 中的子查询中获取值?`
【发布时间】:2011-09-06 10:07:25
【问题描述】:

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

  • 身份证
  • 姓名
  • 消息计数

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

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

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

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

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

【问题讨论】:

    标签: nhibernate nhibernate-criteria


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您!它工作得很好,我真的很高兴你帮了我这个:)
    • 很高兴它成功了。稍后我会尝试返回以更改为更具代表性的子查询。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2021-12-23
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多