left nhibernate criteria

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.