Запрос NHibernate по сравнению двух подзапросов - PullRequest
0 голосов
/ 03 июля 2011

Как мне объединить два подзапроса с запросом запроса с помощью 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, которые позволяют мне сравнивать два метода. Имеет

Где: принимает лямбду

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)

1 Ответ

1 голос
/ 06 июля 2011

Я думаю, что вы сможете решить свою проблему, слегка изменив 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 версия вышеуказанного запроса:

Выбор подзапросов в NHibernate с Critieria API

Надеюсь, это поможет, ура!

...