如何从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进行内联选择?我更喜
- 身份证
- 名字
- 消息计数
内联选择的文档
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)