2009-12-02 9 views
1

Désolé pour le titre cryptique ..Critères NHibernate, sélectionnez par nombre de biens

Pourriez-vous me aider, comment faire une sélection, en fonction du nombre d'une propriété, en utilisant des critères? J'ai un objet (Pool) avec une propriété (PoolItems), et je veux sélectionner tous les Pools w. plus de 5 PoolItems.

Répondre

5

Essayez ceci:

DetachedCriteria dCriteria = DetachedCriteria.For<PoolItem>("pItem") 
      .SetProjection(Projections.Count("Id")) 
      .Add(Restrictions.EqProperty("pItem.PoolID", "pool.Id")); 

IList<Post> posts = Session.CreateCriteria<Pool>("pool") 
       .Add(Subqueries.Gt(5, dCriteria)).List<Pool>(); 

En supposant que la table PoolItem a une colonne poolId comme une clé étrangère de la table de billard. La relation est un un-à-plusieurs. Si la propriété PoolID n'est pas mappée dans la classe PoolItem et que vous avez simplement le mappage d'objet many-to-one nommé "Pool", remplacez dans les critères détachés "pItem.PoolID" par "pItem.Pool.Id".

+0

Ok, ça m'a beaucoup aidé, mais je ne suis pas encore là. Le mappage n'est pas réellement représenté dans la classe PoolItem, uniquement via la clé étrangère dans la base de données et le mappage sur la classe Pool. Devrais-je exposer la relation via une propriété Pool ou y a-t-il une autre/meilleure façon d'y parvenir? Je sais que je peux le faire via SQL, mais je préfère apprendre la méthode des critères: o) – hhravn

+0

Mapper la propriété Pool dans la classe PoolItem n'est pas seulement une bonne idée concernant la représentation schématique des entités, c'est aussi une bonne idée car vous permet d'utiliser la relation pour faire des choses comme la solution ci-dessus. Si vous préférez ne pas avoir une telle propriété dans votre classe parce que vous voulez que le code utilisant n'ait pas accès au Pool ou à la propriété PoolID (vous pouvez les exposer si vous voulez en avoir un en lecture seule - insert = "false" update = "false") vous pouvez le faire correspondre à un champ privé à la place (access = "field"). – tolism7

Questions connexes