2010-08-27 4 views
1

J'ai une instruction de critère de session (Fluent NHibernate) qui ne semble pas filtrer la collection enfant même si j'ai des expressions/restrictions définies.Fluent NHibernate - Les collections ne filtrent pas

ICriteria criteria = session.CreateCriteria(typeof(MyClass)); 
criteria.CreateAlias("MyCollection", "MC"); 
criteria.Add(Restriction.Eq("MC.Property", value)); 
IList<MyClass> list = criteria.List<MyClass>(); 

Cela renvoie tous les objets de type MyClass qui ont MyCollection.Property = value cependant MyCollection n'est pas filtré à MyCollection.Property = value

Il semble que seuls les objets racine sont filtrés.

Merci.

Répondre

2

J'ai seulement trouvé quelques liens douteux à propos de cela - donc c'est à vos risques et périls :).

Il semble que cela devrait fonctionner si vous ajoutez ce qui suit:

criteria.CreateCriteria("MC", JoinType.LeftOuterJoin); 

Je ne le recommanderais pas si selon la réponse de Pedro.

+0

merci! 1+ et bonne réponse – a432511

3

C'est vrai, il va seulement filtrer l'entité racine. Si la requête modifiait les éléments de la collection de l'entité racine, vous pourriez avoir un problème terrible: si vous sauvegardez l'entité à nouveau, les éléments qui ont été filtrés hors de la collection seront définitivement supprimés de la realtionship! Et bien sûr, personne ne veut ça.

Si vous voulez ce comportement, vous devrez le faire manuellement (via foreach après que les entités ont été chargées), bien que je ne recommanderais pas cela pour la raison ci-dessus. Ma suggestion est de faire de l'entité de la collection la racine de la requête.

+0

Merci pour le conseil. 1+ pour expliquer pourquoi je ne voudrais pas le faire! – a432511