2009-09-17 5 views
0

У меня возникли проблемы с получением моего запроса по критериям для работы.NHibernate - нужна помощь с запросом ICriteria

Я хочу отфильтровать коллекцию UserPublications от пользователя, но не фильтрует. Однако коллекция 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); 
    } 
+1

Вы можете передать фактический пользователь? Затем замените .Add (Expression.Eq («user.UserId», userId)); с .Add (Expression.Eq («пользователь», пользователь)); – mxmissile

+0

Это не имело никакого значения, но спасибо в любом случае. – empo

ответ

0

Для будущего ref я получил его, добавив фильтр в отображение fi ле

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

<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

Это решение было получено благодаря этому сообщению http://ayende.com/Blog/archive/2009/05/04/nhibernate-filters.aspx – empo

0

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

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

Идентификатор свойство является частным случаем в NHibernate

+0

Если его свойство Id называется UserId, тогда он должен использовать «UserId» ... –

+0

Не обязательно. Оба способа равны. Из документации: «Идентификатор специального свойства (нижний регистр) может использоваться для ссылки на уникальный идентификатор объекта. (Вы также можете использовать его имя свойства.)« Я думал, что действительна только опция .Id, поэтому ответ бесполезен, тем не менее, также учитывая, что «id» следует записать в нижнем регистре. :) –

+0

Это не имело никакого значения, но спасибо в любом случае. – empo

0

Почему вы не создаете псевдоним для 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, чтобы обнаружить, где-Клиент существует и создать объединение, которое не может работать (ошибка или нет)

+0

Это тоже не имело никакого значения, но в любом случае спасибо. Интересно, что при первом выполнении запроса NHibernate даже не запрашивает таблицу UserPublication. Это не до тех пор, пока я не начну разбираться в отладчике, что выполняется больше запросов, однако он получает все строки UserPublication и НЕ ограничивает идентификатор пользователя. Конечно, это происходит из-за ленивой загрузки.Тем не менее, я все равно ожидаю, что NHibernate запросит таблицу UserPublication при выполнении запроса критериев, но ясно, что этого не происходит. hmmmmmmmmmmmmm ...... – empo

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