2010-05-06 10 views
7

Ich habe über Unterabfrage in Kriterien gelesen, aber ich bin immer noch nicht in der Lage, es richtig zu erfassen. Hier nehme ich ein Beispiel und wenn jemand mir helfen kann, mit Unterabfragen zu schreiben, wird es großartig.Unterabfrage in Kriterien von nHibernate schreiben

Können sagen, wir haben Tabelle

Employee{EmployeeId.(int),Name(string),Post(string),No_Of_years_working(int)} 

Jetzt möchte ich alle Mitarbeiter, die Führungskräfte und arbeiten für weniger als 10 Jahre sind. Ich weiß, dass wir das Ergebnis erhalten können, ohne Unterabfragen zu verwenden, aber ich möchte die Unterabfrage nur verwenden, um zu verstehen, wie es in Kriterien funktioniert.

Also, wie kann ich Kriterien mit Unterabfrage schreiben, um diese Mitarbeiter zu bekommen.

Antwort

11

Nun - der Code sollte wie folgt sein:

DetachedCriteria dc = DetachedCriteria.For<Employee>() 
.Add (Subqueries.PropertyIn("EmployeeId", 
    DetachedCriteria.For<Employee>() 
     .SetProjection(Projections.Property("EmployeeId")) 
     .Add(Restrictions.Lt("No_Of_years_working", 10)) 
     .Add(Restrictions.Eq("Post", "Manager")) 
); 

Hoffnung, das hilft.

0

Ich habe versucht, etwas ähnliches wie Bipuls Aufgabe zu tun, als ich diese Frage fand, also habe ich hauptsächlich bernhardruschs Antwort Idee, aber ich habe festgestellt, dass ohne die Projektionen.projectionList die Unterabfrage nicht funktionieren. Also habe ich beschlossen, ein paar Zeilen Code mit der endgültigen Version zu löschen:

Session session; //You get the session according with your app logic 

//Let's define first the subquery 
DetachedCriteria sub = DetachedCriteria.forClass(Employee.class); 
sub.add(Restrictions.lt("No_Of_years_working", 10)); 
sub.add(Restrictions.eq("Post", "Manager")); 
sub.setProjection( 
Projections.projectionList().add(     Projections.property("EmployeeId") 
) 
); 

//Now the main query 
Criteria criteria = session.createCriteria(Employee.class); 
criteria.add(Property.forName("EmployeeId").in(sub)); 
Verwandte Themen