Использование подзапроса для столбца с QueryOver - PullRequest
3 голосов
/ 20 августа 2011

Я пытаюсь получить что-то похожее на SQL ниже через QueryOver:

SELECT
    docs.*,
    (SELECT TOP 1 eventDate from events WHERE id=docs.id 
    AND type=4 ORDER BY eventDate DESC) as eventDate
FROM documents as docs
WHERE doc.accountId = ...

Я близко подошел к прогнозу, но не уверен, как вернуть всю таблицу документов. Документы имеют отношение «один ко многим» с событиями, я не хочу, чтобы внешнее объединение принесло несколько результатов, а внутреннее объединение может не вернуть строку:

var query = QueryOver<Document>
    .Where(d => d.Account == account)
    .SelectList(list => list
        .Select(d => d)
        .Select(d => d.Events.OrderByDescending(e => e.EventDate).FirstOrDefault(e => e.Type == 4))
    )
    .List<object[]>()
    .Select(d => return new DocumentSummary(d[0],d[1]) etc.);

Есть ли более простой способ выполнения подзапросов для столбцов? Я не хочу заменять это свойство, выполняющее запрос в его get.

1 Ответ

1 голос
/ 22 августа 2011

После некоторых исследований похоже, что HQL (в который конвертируется QueryOver) не поддерживает TOP внутри подзапросов.

Мое решение: создайте представление, включающее вычисленные свойства, а затем отметьте эти свойства в сопоставленияхфайлы как insert="false" и update="false"

...