Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从NHibernate中的子查询中获取值`_Nhibernate_Nhibernate Criteria - Fatal编程技术网

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

如何从NHibernate中的子查询中获取值`,nhibernate,nhibernate-criteria,Nhibernate,Nhibernate Criteria,我目前正在构建一个留言板,在这里我需要在一个线程中输出消息的数量 身份证 名字 消息计数 在纯SQL中,它看起来像这样,但我找不到任何关于如何使内联选择的文档 SELECT t.ID, t.Name (SELECT COUNT(*) FROM Messages m WHERE m.ThreadID = t.ID) FROM Threads t 我只找到了如何使用分离查询限制resultset的示例,而没有找到如何从中选择实际值的示例 如何使用NHibernate进行内联选择?我更喜

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

  • 身份证
  • 名字
  • 消息计数
在纯SQL中,它看起来像这样,但我找不到任何关于如何使
内联选择的文档

SELECT 
t.ID, 
t.Name 
(SELECT COUNT(*) FROM Messages m WHERE m.ThreadID = t.ID)
FROM Threads t 
我只找到了如何使用分离查询限制resultset的示例,而没有找到如何从中选择实际值的示例

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


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

您可以使用投影来完成此操作。使用3.X中的QueryOver API,看起来像这样(在您的例子中,子查询会有所不同,但不会太远):

var subquery=DetachedCriteria.For(“t”)
.添加(限制、设备属性(“t.Pizza.Id”、“p.Id”))
.SetProjection(Projections.Count(“Id”));
p=null;
var-toppedPizzas=session.QueryOver(()=>p)
.Select(projects.Property(()=>p.Id)
,Projections.Property(()=>p.Sauce)
,Projections.Property(()=>p.castle)
,Projections.Alias(Projections.SubQuery(SubQuery),“ToppingCount”))
.List()//然后,您需要自行处理映射(如果需要,请查看ResultTransformer)
这转化为以下标准:

    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)
var subquery=DetachedCriteria.For(“t”)
.添加(限制、设备属性(“t.Pizza.Id”、“p.Id”))
.SetProjection(Projections.Count(“Id”));
var-toppedPizzas=session.CreateCriteria(“p”)
.SetProjection(Projections.Property(“p.Id”)
、预测、财产(“p.Sauce”)
,预测。物业(“p.Castle”)
,Projections.Alias(Projections.SubQuery(SubQuery),“ToppingCount”))
.List()//然后,您需要自行处理映射(如果需要,请查看ResultTransformer)

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

非常感谢!它工作得很完美,我真的很高兴你帮了我这个:)酷,很高兴它成功了。我会试着稍后再回来更改为更具代表性的子查询。
    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)