2010-05-06 11 views
7

He leído acerca de la subconsulta en Criteria, pero sigo sin poder entenderlo correctamente. Aquí estoy tomando un ejemplo y si alguien puede ayudarme a escribirlo mediante la subconsulta será grandioso.Escribir subconsulta en Criterios de nHibernate

digamos que tenemos mesa

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

Ahora quiero que todos los empleados que son Administradores y trabajan por menos de 10 años. Sé que podemos obtener el resultado sin usar subconsultas, pero quiero usar la subconsulta solo para comprender cómo funciona en los criterios.

Entonces, cómo puedo escribir Criteria usando la subconsulta para obtener esos empleados.

Respuesta

11

Bueno - el código debe ser algo como esto:

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

Espero que esto ayude.

0

Estaba tratando de realizar algo similar a la tarea de Bipul, cuando encontré esta pregunta, así que principalmente obtuve la idea de respuesta de bernhardrusch, pero me he dado cuenta de que sin agregar Projections.projectionlist la subconsulta no funciona. Así que he decidido soltar algunas líneas de código con la versión final:

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)); 
Cuestiones relacionadas