Я хочу выбрать все запросы, ожидающие выполнения для данного менеджера. Менеджер может иметь несколько команд.
Я составляю запросы, применяя различные ограничения на основе разрешений, и изменяю запросы, чтобы обеспечить количество строк, проверки существования, подзапросы и т. Д.
Композиция использует QueryOver, хотя использование ICriteria также было бы приемлемо.
Даны следующие классы;
class Team {
public virtual int Manager { get; set; }
public virtual ISet<int> Members { get; set; }
}
class Request {
public virtual int Owner { get; set; }
public virtual bool IsOutstanding { get; set; }
}
class static SomeRestrictions {
public static void TeamsForManager<TRoot> (this IQueryOver<TRoot, Team> query, int managerId) {
// In reality this is a little more complex
query.Where (x => x.Manager == managerId);
}
}
Это текущий запрос, который я пытаюсь (который не работает).
var users = QueryOver.Of<Team> ();
users.TeamsForManager (5)
users.Select (/* not sure */);
var requests = session.QueryOver<Request> ()
.Where (x => x.IsOutstanding)
.WithSubquery.WhereProperty (x => x.Owner).In (users);
HQL для выбора пользователей будет:
"SELECT m FROM Team t JOIN t.Members m WHERE <TeamsForManager restrictions>"
Но я не хочу использовать HQL, потому что потом не могу составить его с другими ограничениями на основе разрешений. Я также не смог бы составить его с другими запросами, чтобы превратить его в число строк / проверки существования и т. Д.