Tengo esta situación:Crear SqlProjection con el alias de la tabla unida
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 recogida de niños? {a} .numerical_answer no funciona y {alias} se refiere al AnswerSet.
El SQL es equivalente
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
Hacerlo es un desastre que está por ocurrir. Esto podría funcionar hoy, pero cuando más tarde se agregue una nueva columna a la base de datos, puede romper esta consulta sin que nadie lo note. Mire aquí: http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/10/25/defensive-database-programming-qualifying-column-names.aspx – Alejandro
Una preocupación válida. A partir de hoy, probablemente resolvería esto utilizando QueryOver y calculando el resultado deseado en código en lugar de tener tantas cadenas mágicas en primer lugar. –