У меня есть объектная модель, где объект календаря имеет IDictionary<MembershipUser, Perms>
с именем UserPermissions, где MembershipUser - это объект, а Perms - простое перечисление. Это в файле отображения для календаря как
<map name="UserPermissions" table="CalendarUserPermissions" lazy="true" cascade="all">
<key column="CalendarID"/>
<index-many-to-many class="MembershipUser" column="UserGUID" />
<element column="Permissions" type="CalendarPermission" not-null="true" />
</map>
Теперь я хочу выполнить запрос, чтобы найти все календари, для которых у определенного пользователя есть определенные разрешения. Разрешение не имеет значения; Я просто хочу список календарей, где данный пользователь присутствует в качестве ключа в словаре UserPermissions. У меня есть свойство username, а не объект MembershipUser
. Как мне построить это с помощью QBC (или HQL)? Вот что я попробовал:
ISession session = SessionManager.CurrentSession;
ICriteria calCrit = session.CreateCriteria<Calendar>();
ICriteria userCrit = calCrit.CreateCriteria("UserPermissions.indices");
userCrit.Add(Expression.Eq("Username", username));
return calCrit.List<Calendar>();
Это созданный неверный SQL - предложение WHERE содержало WHERE membership1_.Username = @p0
, как и ожидалось, но предложение FROM не включало таблицу MemberhipUsers.
Кроме того, мне действительно пришлось потрудиться, чтобы узнать о нотации .indices
. Я нашел это, покопавшись в исходном коде NHibernate, и увидел, что есть также .elements
и некоторые другие точечные обозначения. Где ссылка на разрешенный синтаксис пути ассоциации? Я чувствую, что то, что выше, очень близко, и мне просто не хватает чего-то простого.