2010-02-16 4 views
0

Dans mon système Les utilisateurs possèdent 0 ou plusieurs catégories. Voici une version simplifiée de mes classes de modèle:Sélection d'objets ne faisant pas partie d'une collection dans NHibernate avec l'interface ICriteria

public class User 
{ 
    public virtual String Name {get; set;} 
    public virtual IList<Category> Categories { get; set; } 
} 

public class Category 
{ 
    public virtual String Title {get; set;} 
} 

Je veux maintenant créer une requête ICriteria pour sélectionner toutes les catégories qui ne sont pas attribués à un utilisateur, mais je suis coincé. Idéalement, je ne veux pas créer une propriété de navigation de Catégorie à Utilisateur, mais avec mes connaissances de débutant sur NHibernate, c'est la seule solution que je peux voir.

Y a-t-il une requête ICriteria qui fera cela avec les classes de modèles de données actuelles?

Merci pour votre aide.

+0

Est-il raisonnable de supposer qu'une catégorie ne peut appartenir qu'à un seul utilisateur? Est-il sûr de supposer que la table de catégorie a une clé étrangère à la table d'utilisateur au niveau de base de données? –

+0

Une catégorie appartient à un seul utilisateur et la table Catégorie contient une clé étrangère pour l'utilisateur. –

Répondre

1

Ceci est hors de ma tête, mais pourrait être un pointeur utile.

var crit = _session.CreateCriteria<Category>("c") 
         .Add(
         Subqueries.PropertyNotIn("c.id", 
          DetachedCriteria.For<User>("u") 
           .CreateCriteria("Categories","uc") 
           .SetProjection(Projections.Property("uc.id"))          
         )); 
var unassignedCategories = crit.List<Category>(); 

Vous pouvez probablement avoir une idée de SQL qui sera généré ici:

select c.* from categories where c.id not in (select uc.id from usercategories) 

Hope this helps, et désolé je n'ai pas pu le tester :)

Tobin

+0

Brillant, a travaillé la première fois. –

Questions connexes