2009-09-17 6 views
0

J'ai des difficultés à faire fonctionner ma requête par critères.NHibernate - besoin d'aide avec la requête ICriteria

Je souhaite filtrer la collection UserPublications par userId mais elle ne filtre pas. La collection ClientPublications a filtré correctement cependant.

Un conseil?

Merci d'avance.

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

Pouvez-vous transmettre l'utilisateur actuel? Puis remplacez .Add (Expression.Eq ("user.UserId", userId)); avec .Add (Expression.Eq ("user", user)); – mxmissile

+0

cela n'a pas fait de différence, mais merci quand même. – empo

Répondre

0

Pour le futur ref, je l'ai eu fonctionnant en ajoutant un filtre dans la cartographie fi le

d'abord définir le filtre dans le mappage de classe parente:

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

Ensuite Define filtre plus loin dans la mise en correspondance à la collecte

<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> 

Activez ensuite le filtre et spécifier la valeur du paramètre juste avant l'exécution de la requête ICriteria:

NHibernateSession.EnableFilter("userFilter").SetParameter("userId", userId); 
ICriteria criteria = NHibernateSession.CreateCriteria(typeof(ClientReport)) 
      .CreateCriteria("ClientPublications") 
      blah blah blah     
return GetByCriteria(criteria); 
+0

cette solution a été obtenue grâce à ce post http://ayende.com/Blog/archive/2009/05/04/nhibernate-filters.aspx – empo

0

Si vous cartographié la propriété UserId comme « Id » dans votre fichier de mappage (que vous faites probablement si vous avez utilisé les mêmes conventions que dans this question), il devrait être:

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

Le Id propriété est un cas particulier dans NHibernate

+0

Si sa propriété Id est appelée UserId, il doit utiliser 'UserId' ... –

+0

Pas nécessairement. Les deux moyens sont égaux. De la documentation: "La propriété spéciale (minuscule) id peut être utilisé pour référencer l'identifiant unique d'un objet. (Vous pouvez également utiliser son nom de propriété.)" Je pensais que seule l'option .Id était valide, de sorte que le La réponse est néanmoins inutile, étant donné que "id" doit être écrit en minuscule. :) –

+0

cela n'a pas fait de différence, mais merci quand même. – empo

0

pourquoi ne pas créer un alias pour UserPublications et ajouter l'expression là? comme

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

ou peut-être

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

pour autant que je peux voir appeler

.CreateAlias("ClientUser", "user") 

dépend de la capacité de NH pour détecter où clientUser existe et créer la jointure qui ne peut travailler (bug ou autrement)

+0

Cela n'a pas fait de différence non plus, mais merci quand même. Ce qui est intéressant, c'est que lors de la première exécution de la requête, NHibernate n'interroge même pas la table UserPublication. Ce n'est que lorsque je commence à explorer dans le débogueur que plus de requêtes sont exécutées, mais il obtient toutes les lignes UserPublication et ne pas restreindre par ID utilisateur. Cela se passe bien sûr comme prévu en raison de chargement paresseux.Néanmoins, je m'attendrais toujours à NHibernate pour interroger la table UserPublication lorsque la requête de critères est exécutée, mais il est clair que cela ne se produit pas. hmmmmmmmmmmmmm ...... – empo

Questions connexes