Nhibernate 需要帮助将SQL转换为标准API吗

Nhibernate 需要帮助将SQL转换为标准API吗,nhibernate,icriteria,Nhibernate,Icriteria,我有一个NHibernate应用程序,目前使用SQL Server用户定义函数。我希望避免调用此函数,而是使用NH criteria API表示其逻辑。不幸的是,我很难将NH文档中的标准示例应用到我的特定案例中。因此,我转向这个网站寻求帮助 下面是函数。它接受单个字符串参数并返回一个表。该函数使用不同的联接条件在相同的2个表之间执行3次联接,然后合并结果 如有任何提示,将不胜感激。提前谢谢 编辑:这是针对NH 2.1的 编辑:接受答案中的注释表示转换不可能,这是正确答案 以下是涉及的3个类的映射

我有一个NHibernate应用程序,目前使用SQL Server用户定义函数。我希望避免调用此函数,而是使用NH criteria API表示其逻辑。不幸的是,我很难将NH文档中的标准示例应用到我的特定案例中。因此,我转向这个网站寻求帮助

下面是函数。它接受单个字符串参数并返回一个表。该函数使用不同的联接条件在相同的2个表之间执行3次联接,然后合并结果

如有任何提示,将不胜感激。提前谢谢

编辑:这是针对NH 2.1的

编辑:接受答案中的注释表示转换不可能,这是正确答案

以下是涉及的3个类的映射:

<class name="Revision">
  <id name="RevisionId" type="Guid">
    <generator class="assigned"/>
  </id>
  <set name="LocalizedProperties" inverse="true" lazy="true" cascade="all-delete-orphan">
    <key column="RevisionId"/>
    <one-to-many class="LocalizedProperty"/>
  </set>
  <many-to-one name="DefaultPropertiesLanguage" class="Language" not-null="true"/>
</class>

<class name="Language">
  <id name="LanguageId" type="String" length="16">
    <generator class="assigned"/>
  </id>
  <property name="Lcid" type="Int32" unique="true" not-null="true"/>
</class>

<class name="LocalizedProperty" mutable="false">
  <composite-id>
    <key-many-to-one name="Revision" class="Revision" column="RevisionId"/>
    <key-many-to-one name="Language" class="Language" column="LanguageId"/>
  </composite-id>
  <property name="Title" type="String" length="200" not-null="true"/>
  <property name="Description" type="String" length="1500" not-null="false"/>
</class>

这可能会完成工作(NH 1.2):

但是请注意,这不会生成ANSI语法联接,而是将约束放置在WHERE子句中。我真的不认为这是个问题,你在做一个内部连接而不是外部连接

另外,我现在不记得
Expression.Sql
上正确的参数表示法。 我将它定义为
:LangId
,尽管它也可能是
@LangId


旁注:正如您所看到的,虽然这是一个条件查询,但它只是一组sql语句的拆分,以适应条件API;你确定这就是你所需要的吗?

谢谢你的帮助,这对我很有帮助。不幸的是,它不起作用:(NH抱怨“重复关联路径:LocalizedProperty”。我目前正在调查用视图映射第二和第三LocalizedProperty别名…您是否尝试过使用crit.CreateAlias(“LocalizedProperty”,“lp1”);它可能会抛出相同的错误,但您没有什么可放松的,似乎它不受支持…检查…如果您真的想将代码从数据库移植到应用程序,ISQLQuery是唯一的方法
<class name="Revision">
  <id name="RevisionId" type="Guid">
    <generator class="assigned"/>
  </id>
  <set name="LocalizedProperties" inverse="true" lazy="true" cascade="all-delete-orphan">
    <key column="RevisionId"/>
    <one-to-many class="LocalizedProperty"/>
  </set>
  <many-to-one name="DefaultPropertiesLanguage" class="Language" not-null="true"/>
</class>

<class name="Language">
  <id name="LanguageId" type="String" length="16">
    <generator class="assigned"/>
  </id>
  <property name="Lcid" type="Int32" unique="true" not-null="true"/>
</class>

<class name="LocalizedProperty" mutable="false">
  <composite-id>
    <key-many-to-one name="Revision" class="Revision" column="RevisionId"/>
    <key-many-to-one name="Language" class="Language" column="LanguageId"/>
  </composite-id>
  <property name="Title" type="String" length="200" not-null="true"/>
  <property name="Description" type="String" length="1500" not-null="false"/>
</class>
var crit = nhSes.CreateCriteria(typeof(Revision), "r")
 .SetProjection(
  Projections.SqlProjection(@"r.RevisionId as rid,
    COALESCE(lp1.Title, lp2.Title, lp3.Title) as Title,
    COALESCE(lp1.Description, lp2.Description, lp3.Description) as Description", new[] {"rid", "Title", "Description"}, new[] {NHibernateUtil.Guid, NHibernateUtil.String,NHibernateUtil.String})
 );

crit.CreateCriteria("LocalizedProperty", "lp1", JoinType.InnerJoin);
crit.CreateCriteria("LocalizedProperty", "lp2", JoinType.InnerJoin);
crit.CreateCriteria("LocalizedProperty", "lp3", JoinType.InnerJoin);

crit.Add(Expression.Eq("lp1.LanguageId", langId));
crit.Add(Expression.Sql("lp2.LanguageId = LEFT(:LangId, 2)", langId, NHibernateUtil.String));
crit.Add(Expression.EqProperty("lp3.LanguageId", "r.DefaultPropertiesLanguage"));