2017-10-10 4 views
0

Als relativ neu zu NHibernate habe ich einige grundlegende Codierung geerbt, die ich ändern muss. Ich habe eine Reihe von Objekten vom Typ Gruppe. Jede Gruppe kann ein oder mehrere Kinder des Typs Gruppe haben und wiederum können die Kinder Kinder vom Typ Gruppe usw. haben. Jedes Gruppenobjekt hat eine Eigenschaft/ein Feld mit dem Namen Deleted mit dem Wert "deletedgroup" (eine Art des weichen Löschens). Wenn für eine Gruppe das Feld Gelöscht auf "deletedgroup" gesetzt ist, sollte dies nicht ausgewählt werden. Dies gilt auch für Kinder und Enkelkinder. Mit anderen Worten, ich muss eine Liste aller Gruppen erhalten, bei denen das gelöschte Feld nicht auf "deletedgroup" gesetzt ist. Ich habe dieses Stück Code geerbt, aber es enthält kein Kriterium für das gelöschte Feld, das neu ist, d.h. der Code ruft alle Gruppen ab. Wie erweitere ich den Code, um meine Anfrage zu erfüllen. Ich habe es mit .Where und .Criteria versucht aber ich bekomme entweder Kompilierungsfehler und die Einschränkung funktioniert nicht.NHibernate fetch einschließlich Kinder und ein Kriterium

Enherited Code (selektiert alle Gruppen):

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

Antwort

0

Ich bevorzuge normalerweise LINQ Abfragen mit NH als ich die Syntax intuitiver finden. Der LINQ-Provider in NH ist nicht perfekt, es gibt Zeiten, in denen QueryOver weit überlegen ist. Doch in diesem Fall denke ich, das LINQ -basierte Abfrage sollte für Sie arbeitet:

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(); 

Vielleicht versuchen und sehen, ob es die gewünschte Wirkung hat.

+0

Hat nicht funktioniert. Scheint so, als ob die Where-Klausel jede Gruppe herausfiltert, so dass das Ergebnis null Gruppen ist, genau wie ich die orignal-Abfrage mit einer Where-Klausel erlebt habe. Das Weglassen der Where-Klausel gibt alle Gruppen als ursprüngliche Abfrage zurück. – Torben

+0

Ah. Brauchen Sie so etwas wie eine korrelierte Unterabfrage, die mit der 'Deleted! =" Deletedgroup "zuerst geeignete Gruppen findet und dann nur Gruppen zurückgibt, die sich in dieser Liste befinden? –

+0

Ich habe meine Antwort mit diesem Konzept bearbeitet, aber ich bin mir nicht sicher, dass es genau das ist, wonach Sie suchen. –

Verwandte Themen