Nhibernate 使用联接表的别名创建SqlProjection

Nhibernate 使用联接表的别名创建SqlProjection,nhibernate,criteria,Nhibernate,Criteria,我有这样的情况: public class AnswerSet { public virtual IList<Answer> Answers {set; get;} } session.CreateCriteria<AnswerSet>() .CreateAlias( "Answers", "a" ) .SetProjection( Projections.ProjectionList() .Add( Projecti

我有这样的情况:

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" )
谢谢你,

Daniel

如果查询中的任何其他地方都没有出现
数字答案,您可以跳过表名,例如

"count (case numerical_answer when 1 then 1 when -1 then 1 else null end) as YesAnswers"

我知道这已经晚了,但希望它能帮助任何人。我从生成SQL时NHiberate重命名联接表别名的代码中找到了答案

每个投影别名都会使用别名索引和x进行修改

因此,在您的情况下,您可以使用

a1_.numerical_answer
如果添加更多别名,则可以在SQL投影中使用它们,如下所示:

b2_.some_property, c3_.another_property, etc.

请注意,创建别名的顺序很重要。在我的例子中,我有一个表,其中有许多按用户定义的顺序和发生的联接,因此我需要求助于此,它工作得很好。

这样做是一场即将发生的灾难。这可能在今天起作用,但当稍后向数据库中添加一个新列时,它可能会在没有人注意到的情况下中断此查询。看这里:一个合理的担忧。到今天为止,我可能会通过使用QueryOver并在代码中计算所需的结果来解决这个问题,而不是一开始就有这么多神奇的字符串。
b2_.some_property, c3_.another_property, etc.