2011-04-08 70 views
7

的别名SqlProjection我有这种情况:创建连接表

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不工作,{别名}引用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 

谢谢
丹尼尔

回答

4

如果numerical_answer没有其他地方出现在您的查询,你可以直接跳过表的名称,例如

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

这样做是等待发生的灾难。这可以在今天使用,但是当稍后将新列添加到数据库时,可能会在没有人注意的情况下中断该查询。看看这里:http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/10/25/defensive-database-programming-qualifying-column-names.aspx – Alejandro 2016-06-29 17:12:32

+0

有效的关注。截至今天,我可能会解决这个问题,通过使用QueryOver并在代码中计算所需的结果,而不是首先有很多魔术字符串。 – 2016-07-18 09:33:41

0

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

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

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

a1_.numerical_answer 

如果添加多个别名,你可以在SQL预测使用它们像这样:

b2_.some_property, c3_.another_property, etc. 

注意顺序事项中别名被创建。在我的情况下,我有一个用户定义的顺序和发生许多连接的表,所以我需要诉诸这一点,它很好。