2014-09-10 4 views
0

я хотел бы, чтобы решить эту проблему:Как я могу генерировать NHibernate GROUP BY без ВЫБРАТЬ свойство

SELECT Max(Date) 
FROM Table 
GROUP BY SubId 

(а затем передать его в качестве подзапроса в середине действия, так что я могу получить идентификатор элемента в таблице)

SELECT Id 
FROM Table 
WHERE Date in 
[[[ previous request ]]] 

(а затем получить полную таблицу Item с другой таблицы присоединиться)

SELECT * 
FROM Table 
LEFT JOIN... 
WHERE Id in 
[[[ previous request ]]] 

Я попробовал этот вид reques t:

var subquery = QueryOver.Of<Table>(() => x) 
        .SelectList(list => list 
        .SelectMax(() => x.Date) 
        .SelectGroup(() => x.Sub.Id) 
       ); 

       var filter = QueryOver.Of<Table>().WithSubquery. 
        WhereExists(subquery) 
        .Select(p => p.Id); 

       var result = Session.QueryOver<Table>().WithSubquery.WhereProperty(p => p.Id).In(filter).Left.JoinQueryOver(p => p.Sub).List(); 

Но проблема в том, что я не могу получить первый запрос с моей датой только с моей даты. Есть ли лучший способ сделать это, чем такие подзапросы? И есть ли возможность в NHibernate Groupy By Property без ее выбора?

Спасибо!

+0

Это возможно. Проверьте [this] (http://stackoverflow.com/a/20537260/1679310) и/или [это] (http://stackoverflow.com/a/25531842/1679310) –

+0

Спасибо за отзыв. Я попробую еще раз, но на данный момент я нашел решение. – Revv

+0

@Revv: возможное решение здесь: http://stackoverflow.com/a/30915886/750216 –

ответ

1

Наконец-то сделал это так и создал SQL-запрос. Но это было не 3 подзапроса, а именно 3 запроса, которые смотрели в наборе данных (подзапросы массивов и корреспондирующие индексы).

var subquery = Session.QueryOver<Table>(() => x) 
        .SelectList(list => list 
        .SelectMax(() => x.Date) 
        .SelectGroup(() => x.Sub.Id)) 
        .List<object[]>().Select(p => p[0]).ToArray(); 


       var CorrespondingIds = Session.QueryOver<Table>(() => x) 
        .WhereRestrictionOn(() => x.Date).IsIn(subquery) 
        .Select(p => p.Id).List<int>().ToArray(); 

       var result = Session.QueryOver<Table>(() => x).WhereRestrictionOn(() => x.Id).IsIn(CorrespondingIds).Left.JoinQueryOver(p => p.Sub).List(); 
+0

Это приятное решение! Великий .. наслаждайтесь NHibernate –

Смежные вопросы