NHibernate OrderBy是一个相关的子查询

时间:2013-07-31 13:42:40

标签: nhibernate correlated-subquery

我有一个parent,其集合为property。每个property都有propertyclassvalue。我想返回一个parent的列表,该列表由value附加的任何附加property订阅propertyclass

假设parent表示汽车,存在property propertyclass“颜色”。我想返回按“颜色”属性的值排序的所有汽车的列表。

在直接SQL中,这很容易,我们可以通过相关子查询来排序。

SELECT * FROM [Parent] 
ORDER BY (SELECT [Value] FROM [Property] WHERE [PropertyClass] = 'Color' 
  AND [ParentId] = [Parent].[Id]) 

但我不知道如何在NHibernate中完成这个任务。

我已经创建了一个子查询投影,并使用它设置了查询的顺序:

var dc = DetachedCriteria.For<Core.Property>()
  .Add(Restrictions.Eq("PropertyClass", sortByProperty))
  .SetProjection(Projections.Property("Value"));
var query = baseQuery.OrderBy(Projections.SubQuery(dc));

但是由此生成的order-by子句错过了相关的子查询部分 - [ParentId] = [Parent].[Id],因此是无效的sql。如何使此子查询与基本查询相关?

1 个答案:

答案 0 :(得分:0)

想出来。

Core.Property propAlias = null;

baseQuery.JoinAlias(parent => parent.Properties, () => propAlias)
  .Where(() => propAlias.PropertyClass == sortByProperty);

var query = baseQuery.OrderBy(() => propAlias.Value);