2017-10-10 53 views
0

Étant relativement nouveau à NHibernate j'ai hérité de quelques codages de base que je dois modifier. J'ai un tas d'objets de type Groupe. Chaque groupe peut avoir un ou plusieurs enfants de type Groupe et de nouveau les enfants peuvent avoir des enfants de type Groupe et ainsi de suite. Chaque objet Groupe possède une propriété/champ appelé Supprimé avec la valeur "groupe supprimé" (une sorte de suppression douce). Dans le cas où un groupe a le champ Supprimé défini sur "groupe supprimé", il ne doit pas être sélectionné, de même que les enfants et les petits-enfants. En d'autres termes, je dois obtenir une liste de tous les groupes n'ayant pas le champ supprimé défini sur "groupe supprimé". J'ai ce morceau de code hérité mais il n'inclut pas de critère pour le champ supprimé qui est nouveau, c'est-à-dire que le code récupère tous les groupes. Comment puis-je développer le code pour répondre à ma demande. J'ai essayé avec .Where et .Criteria mais je reçois soit des erreurs de compilation que la restriction ne fonctionne pas.NHibernate fetch y compris les enfants et un critère

Code Enherited (sélectionne tous les groupes):

var allGroups = ObjectFactory.GetInstance<IUnitOfWork>().Session 
         .QueryOver<Group>() 
         .Fetch(g => g.ChildGroups).Eager 
         .Fetch(g => g.Vacancies).Eager 
         .TransformUsing(new DistinctRootEntityResultTransformer()) 
         .List(); 

Répondre

0

Je suis en faveur généralement LINQ requêtes avec NH que je trouve la syntaxe plus intuitive. Le fournisseur LINQ dans NH n'est pas parfait, il y a des moments où QueryOver est de loin supérieur. Cependant, dans ce cas, je pense que cette requête LINQ devrait fonctionner pour basé vous:

var activeGroupIds = 
    ObjectFactory.GetInstance<IUnitOfWork>().Session 
     .Query<Group>() 
     .Where(g => g.Deleted != "deletedgroup") 
     .Select(g => g.Id); 

var allGroups = 
    ObjectFactory.GetInstance<IUnitOfWork>().Session 
     .Query<Group>() 
     .FetchMany(g => g.ChildGroups) 
     .FetchMany(g => g.Vacancies) 
     .Where(g => activeGroupIds.Contains(g.Id)) 
     .ToList(); 

Peut-être essayer cela et voir si elle a l'effet désiré.

+0

Ne fonctionne pas. On dirait que la clause where filtre tous les groupes de sorte que le résultat est zéro groupes comme j'ai expérimenté en utilisant la requête orignal avec une clause where. L'omission de la clause where renvoie tous les groupes en tant que requête d'origine. – Torben

+0

Ah. Alors avez-vous besoin de quelque chose comme une sous-requête corrélée qui trouve d'abord des groupes éligibles avec le groupe supprimé de '' Deleted! = "" Et qui ne renvoie que les groupes qui sont dans cette liste? –

+0

J'ai modifié ma réponse avec ce concept, mais je ne suis pas sûr que ce soit exactement ce que vous cherchez. –