Запрос NHibernate к ключевому полю словаря (карта) - PullRequest
1 голос
/ 05 мая 2010

У меня есть объектная модель, где объект календаря имеет 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 и некоторые другие точечные обозначения. Где ссылка на разрешенный синтаксис пути ассоциации? Я чувствую, что то, что выше, очень близко, и мне просто не хватает чего-то простого.

1 Ответ

2 голосов
/ 17 января 2011

Просто пытаюсь сделать это сам, и похоже, что это можно сделать с помощью HQL, но не Criteria API.

https://nhibernate.jira.com/browse/NH-1795

Чтобы сделать это на HQL:

http://ayende.com/Blog/archive/2009/06/03/nhibernate-mapping-ndash-ltmapgt.aspx

Специально ищите комментарий Айенде:

Это что-то вроде: выберите 1 из профиля p присоединиться к p.Entries e где index (e) = 'HasCats' и e = 'true'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...