NHibernate - нужна помощь с запросом ICriteria - PullRequest
0 голосов
/ 17 сентября 2009

У меня проблемы с получением запроса по критериям.

Я хочу отфильтровать коллекцию UserPublications по userId, но она не фильтруется. Хотя коллекция ClientPublications отфильтрована правильно.

Любой совет?

Заранее спасибо.

public IList<ClientReport> GetAvailableClientReports(int userId)
    {
        ICriteria criteria = NHibernateSession.CreateCriteria(typeof(ClientReport))
            .CreateCriteria("ClientPublications")                
            .Add(Expression.Eq("IsDownloaded", true))
            .SetResultTransformer(CriteriaUtil.DistinctRootEntity)
            .AddOrder(Order.Asc("Name"))
            .CreateCriteria("UserPublications")                    
            .CreateAlias("ClientUser", "user")
            .Add(Expression.Eq("user.UserId", userId));

        return GetByCriteria(criteria);
    }

Ответы [ 3 ]

0 голосов
/ 18 сентября 2009

почему бы вам не создать псевдоним для UserPublications и добавить туда выражение? как

.CreateCriteria("UserPublications", "up")                    
.Add(Expression.Eq("up.ClientUser.UserId", userId));

или, может быть,

.CreateCriteria("UserPublications", "up")                    
.CreateAlias("up.ClientUser", "user")
.Add(Expression.Eq("user.UserId", userId));

насколько я вижу, звонит

.CreateAlias("ClientUser", "user")

зависит от способности NH определить, где существует ClientUser, и создать соединение, которое может не работать (ошибка или иное)

0 голосов
/ 18 сентября 2009

Для будущей ссылки я заработал, добавив фильтр в файл сопоставления

Сначала определите фильтр в отображении родительского класса:

<filter-def name="userFilter">
  <filter-param name="userId" type="System.Int32"/>
</filter-def>

Затем определите фильтр далее в сопоставлении с коллекцией

<bag name="UserPublications" access="property" lazy="true" cascade="all-delete-orphan">      
  <key column="ClientPublicationID"/>
  <one-to-many class="ReportMgr.Model.ClientUserPublication, ReportMgr.Model" />
  <filter name="userFilter" condition="ClientUserID = :userId"></filter>
</bag>

Затем включите фильтр и укажите значение параметра непосредственно перед выполнением запроса ICriteria:

NHibernateSession.EnableFilter("userFilter").SetParameter("userId", userId);
ICriteria criteria = NHibernateSession.CreateCriteria(typeof(ClientReport))
            .CreateCriteria("ClientPublications")
            blah blah blah                   
return GetByCriteria(criteria);
0 голосов
/ 17 сентября 2009

Если вы сопоставили свойство UserId как «Id» в своем файле сопоставления (что вы, вероятно, сделаете, если использовали те же соглашения, что и в этот вопрос ), оно должно быть:

.Add(Expression.Eq("user.Id", userId))

Свойство Id - это особый случай в NHibernate

...