Я понимаю, что этому вопросу 5 лет, и «правильный» ответ определенно состоит в том, что вы не можете сделать это с помощью QueryOver, как указывают другие ответы.Однако, если вам действительно нужна эта функциональность (как я это сделал), я нашел достойный обходной путь.
Решение состоит в том, чтобы использовать «запрос загрузчика» с собственным SQL-кодом в вашем отображаемом XML для создания связанной коллекции (см. http://nhibernate.info/doc/nhibernate-reference/querysql.html#querysql-load). В конкретном примере OP вы можете продолжить и отобразить свой DatabaseView
как сущность, как предложено, и затем напишите в своем отображении следующее:
<class name="MyObject"...>
...
<set name="MyViews" inverse="true">
<key column="ObjectId" foreign-key="none"/>
<one-to-many class="MyObject"/>
<loader query-ref="myObjectViewsLoadQuery"/>
</set>
</class>
Тогда нам просто нужно определить наше именованное myObjectViewsLoadQuery
в необработанном SQL, чтобы объяснить NH, как объединить эти два элемента:
<sql-query name="myObjectViewsLoadQuery">
<load-collection alias="view" role="MyObject.MyViews"/>
SELECT view.*
FROM DatabaseView view
WHERE view.ObjectId = :id
</sql-query>
Теперь мы можем притворяться, будто в нашем запросе есть «настоящая» коллекция с именем MyViews
, относящаяся MyObject
к DatabaseView
:
MyObject alias = null;
DatabaseView view = null;
var results = session.QueryOver<MyObject>(() => alias)
.JoinAlias( () => alias.MyViews, () => view )
//.Where( () => view.Property == "myValue" ) // optionally, restrict the view etc.
.List();
Конечно, этоесли вы заботитесь только о «элегантном» запросе, вам придется столкнуться с большими трудностями. Однако если вы используете QueryOver по той причине, что вы хотите иметь возможность принимать произвольные входные выражения для фильтрации вашего DatabaseView или других подобных действий,это работает очень хорошо.