使用连接表的别名创建SqlProjection

时间:2011-04-08 06:40:07

标签: nhibernate criteria

我遇到这种情况:

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" )

如何指定子集合别名?   {a} .numerical_answer 无效, {alias} 指的是AnswerSet。

SQL等价物是

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

谢谢你,
丹尼尔

2 个答案:

答案 0 :(得分:4)

如果numerical_answer未出现在查询中的任何其他位置,则可以跳过表名称,例如

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

答案 1 :(得分:0)

我知道这已经很晚了,但希望它对任何人都有帮助。我从代码中找到了它,NHiberate在生成SQL时重命名连接表的别名。

每个投影别名都使用别名的索引和_。

进行修改

所以在你的情况下,你可以使用

a1_.numerical_answer

如果添加了更多别名,可以在SQL预测中使用它们,如下所示:

b2_.some_property, c3_.another_property, etc.

请注意,订单对创建别名很重要。在我的情况下,我有一个用户定义的顺序和出现的许多连接的表,所以我需要求助于它并且它工作得很好。