【问题标题】:NHibernate query over comparing two sub queriesNHibernate 查询超过比较两个子查询
【发布时间】:2011-07-06 04:55:21
【问题描述】:

如何将两个子查询与 queryover 与 WithSubQuery 结合起来?我想要下面的东西(确切的语法无关紧要):

 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 方法。它有

哪里:需要一个 lambda

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)

【问题讨论】:

  • 您能否提供一个示例,说明您希望生成的 SQL 是什么样子?

标签: nhibernate queryover


【解决方案1】:

我认为你应该能够通过稍微修改sql-query来解决你的问题:

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])
)

如果返回正确的结果集,那么您可以使用QueryOver 来实现它,如下所示:

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

我希望这会有所帮助,干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2011-12-06
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多