2011-07-03 60 views
0

你如何将两个子查询与WithSubQuery的查询结合起来?我想类似下面(准确的语法无所谓):通过比较两个子查询的NHibernate查询

query.WithSubquery.WhereValue(QueryOver.Of<Child>() 
            .Where(m => m.Parent.Id == paretAlias.Id) 
            .Select(Projections.Max("SomeProp"))) 
            .Lt(QueryOver.Of<Child>(() => childAlias) 
            .Where(m => childAlias.Id == parentAlias.Id) 
            .Select(Projections.Max("SomeOtherProp"))); 

我看不到,让我来比较两种方法WithSubquery的任何方法。它有

其中:需要拉姆达

WhereProperty:需要一个属性与子查询

WhereValue比较:取一个值与子查询

WhereExists比较:需要查询。

基本上我想有一个方法需要子查询与和另一个子查询

比较在SQL中的示例输出的查询是:

select * from Parent inner join child on parent.id = child.parentid where 
    (select max(SomeProp) from child where child.parentid = parent.id) > (select max(SomeOtherProp) from child where child.parentid = parent.id) 
+0

你能提供一个你希望生成的SQL看起来像什么样子的例子吗? –

回答

1

我想你应该能够解决您的

SELECT p.* FROM [Parent] as p 
WHERE EXISTS 
(
    SELECT c.[parentId] as parentid FROM [Child] as c 
    WHERE c.[parentid] = p.[id] 
    GROUP BY c.[parentid] 
    HAVING MAX(c.[someProp]) < MAX(c.[someOtherProp]) 
) 

如果返回正确的结果集,那么你就可以实现:通过稍微修改了sql-query问题像这样:

Parent p = null; 
Child c = null; 

var subquery = QueryOver.Of(() => c) 
    .SelectList(list => list.SelectGroup(() => c.ParentId)) 
    .Where(Restrictions.LtProperty(
     Projections.Max(() => c.SomeProp), 
     Projections.Max(() => c.SomeOtherProp))) 
    .And(Restrictions.EqProperty(
     Projections.Property(() => c.ParentId), 
     Projections.Property(() => p.Id))); 

var query = QueryOver.Of(() => p) 
    .WithSubquery.WhereExists(subquery); 

IList<Parent> resutl = Session.CreateQuery(query); 

我已经回答了类似的问题,也有Criteria API版本以上查询:

Selecting on Sub Queries in NHibernate with Critieria API

我希望这有助于,干杯!