2012-03-10 3 views
1

Как я могу заменить запрос HQL ниже с помощью API QueryOver?Crossjoin using QueryOver

var sql = "from Role r, Action a where r.Active = :active and a.Active = :active"; 
var result = manager.Session.GetISession().CreateQuery(sql) 
      .SetBoolean("active", true).List(); 

ответ

2

Я не верю есть способ сделать это в QueryOver, так как JoinAlias и JoinQueryOver требуют выражения, описывающего путь к соответствующему объекту.

Однако это легко сделать в LINQ к NHibernate:

var result = 
    (from role in manager.Session.GetISession().Query<Role>() 
    from action in manager.Session.GetISession().Query<Action>() 
    where role.Active == true && action.Active == true).ToList(); 

С NH 3.2, вот SQL я получаю:

select role0_.Id as col_0_0_, 
     action1_.Id as col_1_0_ 
from [Role] role0_, 
     [Action] action1_ 
where role0_.IsActive = 1 /* @p0 */ 
     and action1_.IsActive = 1 /* @p1 */ 
+0

Гм, нет, это не будет. Он будет генерировать один оператор SQL ... –

+0

Хотя решение выше позволяет избежать проблем с магическими строками, но я не верю, что он хороший. Это связано с тем, что вышеупомянутое утверждение приведет NHibernate к многократной базе данных. Скажем, таблица ролей имеет 4 записи, таблица действий имеет 6 записей. Первый запрос NHibernate выполняется, чтобы вернуть 4 записи из таблицы ролей. Затем для каждой возвращенной записи NHibernate будет считывать базу данных, чтобы получить 6 записей из таблицы действий. Другими словами, количество маршрутов в базе данных равно количеству возвращенных записей из первого запроса и добавлению к одному. – tilonthuduc

+0

Andrew, я попробовал, и результат - то, что я описал выше. Могли бы вы сделать то же самое? – tilonthuduc

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

  • Нет связанных вопросов^_^