2010-02-20 21 views
9

Con empleados y subordinados: quiero cargar a un empleado con el recuento de subordinados en una consulta.Cómo asignar el recuento de la recopilación a la entidad con fluent-nhibernate

public class Employee 
{ 
    public Name {get;set;} 
    public int NumberOfSubordinates {get;set;} 
} 

SQL resultante debe ser similar:

select e.name, (select count(*) from subordinate s where s.employee_id = e.id) NumberOfSubordinates 
from employee e 
group by e.name 
order by NumberOfSubordinates desc 
+0

Solo una observación con el SQL, pero parece que esta es una mala forma de obtener los datos que necesita, ¿no debería reemplazarse el sub selección con un JOIN en la tabla subordinada, luego un conteo (*) en él daría como resultado el mismo valor? Parece que estás forzando al planificador de consultas a tomar una ruta ineficiente al hacer lo anterior. No tiene gran relevancia para ti, pero es lo que estoy buscando en este momento. – Martin

Respuesta

15

Se podría trazar esta columna como una fórmula.

Map(x => x.NumberOfSubordinates) 
    .FormulaIs(@"select count(*) from subordinate where subordinate.employee_id = id"); 

Un enfoque diferente es asignar Subordinates como una bolsa inversa y usar lazy = "extra". En este caso, Subordinates.Count realizará el SQL count(*), aunque no como parte de la carga inicial. Este enfoque aún no puede estar disponible en Fluent.

+0

por favor, hágale saber cuándo está disponible en Fluent. –

+0

Use 'ExtraLazyLoad' http://stackoverflow.com/a/5962775/265877 – Alex

+0

Mientras esto funciona, no creo que sea eficiente ya que está ejecutando una subconsulta en su cláusula de selección. ¿Hay alguna manera de unirse a la tabla secundaria con un grupo en la consulta principal? – Alex

Cuestiones relacionadas