2011-04-14 10 views
7

Cuando tengo una referencia a la misma tabla en mi selección como en mi cláusula where, linq a Nhibernate genera dos uniones, una para la selección y otra para el lugar. es decir,Linq a NHibernate generar múltiples uniones a la misma tabla

from child in Session.Query<Child>() 
where child.Parent.Name == "Bob" 
select new Info 
{ 
    ParentAge = child.Parent.Age, 
    ChildName = child.Name 
}; 

Genera SQL como:

Select this_.Name, 
     parent1.Age 
From Child this_ 
    left join Parent parent1 on child.ParentId = parent1.Id, 
Parent parent2 

Where child.ParentId = parent2.Id and parent2.Name = 'Bob' 

yo habría pensado que debería obtener más como SQL:

Select this_.Name, 
     parent1.Age 
From Child this_ 
     inner join Parent parent1 on child.ParentId = parent1.Id 
Where parent1.Name = 'Bob' 

¿Hay una manera de estructurar la consulta para conseguir esto? ¿Importa?

+0

¿cómo se establece su archivo de asignación? ¿Ha configurado la opción de cascada en falso? – cpoDesign

Respuesta

1

¿Ha intentado comparar el plan de ejecución de consultas para cada uno en SSMS? Si la combinación duplicada se elimina en SQL Server, entonces no importa. He encontrado que ese es el caso en algunos casos en los que pensé que la consulta generada iba a ser muy ineficiente, pero después de la optimización termina exactamente igual que una consulta que parece mucho mejor.

+0

Gracias Joel, en este caso sin duda el optimizador de SQL Server genera efectivamente el mismo plan de ejecución para cada consulta, por lo que realmente no importa. Para casos más complejos, podría intentarlo y ver. –

4

Usted puede prevenir NHibernate de hacer esto mediante el uso de un identificador transparente, de modo que su consulta es el siguiente:

from child in Session.Query<Child>() 
let p = child.Parent 
where p.Name == "Bob" 
select new Info { 
    ParentAge = p.Age, 
    ChildName = child.Name 
}; 
Cuestiones relacionadas