分离标准 - 如何指定连接条件

时间:2013-05-17 11:43:41

标签: .net sql nhibernate detachedcriteria

我正在尝试使用Nhibernate分离标准从数据库中检索一些数据。问题是我不知道如何在Detached条件中指定连接条件。请在下面找到我的代码,

var criteria = DetachedCriteria.For<ExtraRiskQuestionAnswer>("extraRiskQuestionAnswer")
                .CreateAlias("RefRiskQuestion", "refRiskQuestion", JoinType.RightOuterJoin)
                .Add( Restrictions.Disjunction().
                     Add(Restrictions.Eq("CRMContactId", crmContactId))
                     .Add(Restrictions.IsNull("CRMContactId")));

这会转换为 -

SELECT refriskque1_.RefRiskQuestionId as y0_, refriskque1_.Question as y1_, this_.Answer as y2_ 
FROM FactFind.dbo.TExtraRiskQuestionAnswer this_ 
right outer join Administration.dbo.TRefRiskQuestion refriskque1_ on this_.RefRiskQuestionId=refriskque1_.RefRiskQuestionId 

WHERE this_.CRMContactId = 4670861 or this_.CRMContactId is null

但我想要的是它应该被翻译成下面。

SELECT refriskque1_.RefRiskQuestionId as y0_, refriskque1_.Question as y1_, this_.Answer as y2_ 
FROM FactFind.dbo.TExtraRiskQuestionAnswer this_ 
right outer join Administration.dbo.TRefRiskQuestion refriskque1_ on this_.RefRiskQuestionId=refriskque1_.RefRiskQuestionId 
and this_.CRMContactId = 4670861 or this_.CRMContactId is null

任何帮助非常感谢。感谢。

1 个答案:

答案 0 :(得分:1)

NHiberante非常强大。您使用CreateAlias方法的重载之一如下所示:

public DetachedCriteria CreateAlias(string associationPath
, string alias
, JoinType joinType
, ICriterion withClause);

本案例中最有趣的部分是最后一个 withClause 。这实际上是将条件直接定义到JOIN子句

所以你应该做的就是这样:

var restriction = Restrictions.Disjunction()
  .Add(Restrictions.Eq("CRMContactId", crmContactId))
  .Add(Restrictions.IsNull("CRMContactId")));

这样做只是调整了DetachedCriteria的定义:

var criteria = DetachedCriteria.For<ExtraRiskQuestionAnswer>("extraRiskQuestionAnswer")
  .CreateAlias("RefRiskQuestion"
  , "refRiskQuestion"
  , JoinType.RightOuterJoin
  , restriction ) // HERE we go, that will be placed where you expected

现在你应该拥有你需要的东西。换句话说,JOIN子句的任何其他限制必须放在 WithClause 中