left - nhibernate session createquery
Crear SqlProjection con alias de la tabla unida (2)
Si numerical_answer
no aparece en ninguna otra parte de su consulta, puede omitir el nombre de la tabla, por ejemplo
"count (case numerical_answer when 1 then 1 when -1 then 1 else null end) as YesAnswers"
Tengo esta situación:
public class AnswerSet {
public virtual IList<Answer> Answers {set; get;}
}
session.CreateCriteria<AnswerSet>()
.CreateAlias( "Answers", "a" )
.SetProjection( Projections.ProjectionList()
.Add( Projections.GroupProperty( "TopicId" ), "TopicId" )
.Add( Projections.GroupProperty( "TopicName" ), "TopicName" )
.Add( Projections.SqlProjection( "count (case **{a}**.numerical_answer
when 1 then 1 when -1 then 1 else null end) as YesAnswers",
new[] { "YesAnswers" }, new IType[] { NHibernateUtil.Int32 } ), "YesAnswers" )
¿Cómo puedo especificar el alias de la colección hija? {a} .numerical_answer no funciona y {alias} hace referencia al AnswerSet.
El equivalente SQL es
select
[as].topic_id as TopicId
, [as].topic_name as TopicName
, count (case [a].numerical_answer
when 1 then 1
when -1 then 1
else null
end) as YesAnswers
from answer_set [as] join answer [a] on [a].answer_set_id = [as].id
Gracias,
Daniel
Sé que es tarde, pero espero que ayude a cualquiera. Lo descubrí en el código donde NHiberate cambia el nombre de los alias para las tablas combinadas al generar el SQL.
Cada alias de proyección se modifica con un índice del alias y un _.
Entonces en tu caso, puedes usar
a1_.numerical_answer
Si agregó más alias, podría usarlos en las proyecciones SQL como esta:
b2_.some_property, c3_.another_property, etc.
Tenga en cuenta que la orden importa en qué alias se crean. En mi caso, tenía una tabla con muchas combinaciones en orden y ocurrencia definida por el usuario, así que tuve que recurrir a esto y funciona muy bien.