C# 从表值函数nhibernate中选择

C# 从表值函数nhibernate中选择,c#,sql-server,nhibernate,hql,user-defined-functions,C#,Sql Server,Nhibernate,Hql,User Defined Functions,我需要一些帮助。 我试图在select中使用表值函数,但得到的错误是未映射 dbo.FnListEvnt未映射[来自dbo.FnListEvnt(:dt,:id,:code)] 作用 CREATE FUNCTION [dbo].[FnListEvnt] (@DT DATETIME, @ID INT, @CODE VARCHAR (4)) RETURNS @RESULTADO TABLE ( ID INT , DT

我需要一些帮助。 我试图在select中使用表值函数,但得到的错误是未映射

dbo.FnListEvnt未映射[来自dbo.FnListEvnt(:dt,:id,:code)]

作用

CREATE FUNCTION [dbo].[FnListEvnt]
(@DT DATETIME, @ID INT, @CODE VARCHAR (4)) 
RETURNS 
    @RESULTADO TABLE (
        ID            INT          ,
        DT_INIC            DATETIME     ,
        DT_TMNO            DATETIME     ,
        CD_EVNT            VARCHAR (5)  )
AS
BEGIN
自定义方言(在.config中定义)

质疑


您将无法为此使用
RegisterFunction
。这是用来注册标量函数的

但是,您可以创建一个命名查询并执行它。但这涉及到几个步骤:

  • 创建命名的查询XML文件。这必须以
    *.hbm.xml
    结尾。我发现保持命名查询、函数和XML文件的名称不变很有用,但这不是必需的。下面是XML文件的示例:

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
      <sql-query name="FnListEvnt">
        <return-scalar column="ID" type="integer"/>
        <return-scalar column="DT_INIC" type="DateTime"/>
        <return-scalar column="DT_TMNO" type="DateTime"/>
        <return-scalar column="CD_EVNT" type="string" />
    
        select
          *
        from
          dbo.[FnListEvnt](:dt, :id, :code);
    
      </sql-query>
    </hibernate-mapping>
    
  • 使用
    GetNamedQuery
    创建查询,然后设置参数并执行查询:

    var results = session.GetNamedQuery("FnListEvnt")
        .SetDateTime("dt", DateTime.Now)
        .SetInt32("id", 4)
        .SetString("code", "code")
        .SetResultTransformer(Transformers.AliasToBean<Result>())
        .List<Result>();
    
    var results=session.GetNamedQuery(“FnListEvnt”)
    .SetDateTime(“dt”,DateTime.Now)
    .SetInt32(“id”,4)
    .SetString(“代码”、“代码”)
    .SetResultTransformer(Transformers.AliasToBean())
    .List();
    

  • 就是这样。现在,您应该能够将TVF与NHibernate一起使用。

    我相当确定
    RegisterFunction
    仅对标量值函数有用。您可能必须使用命名查询--这可以接受吗?这样的答案(我真的很喜欢,我喜欢;)让我感到更加绝望。。。NHibernate时代已经结束。。。真遗憾。。。因为我们/他们可以用它做很多事情。。。
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
      <sql-query name="FnListEvnt">
        <return-scalar column="ID" type="integer"/>
        <return-scalar column="DT_INIC" type="DateTime"/>
        <return-scalar column="DT_TMNO" type="DateTime"/>
        <return-scalar column="CD_EVNT" type="string" />
    
        select
          *
        from
          dbo.[FnListEvnt](:dt, :id, :code);
    
      </sql-query>
    </hibernate-mapping>
    
    public class Result
    {
        public int ID { get; set; }
    
        public DateTime DT_TMNO { get; set; }
    
        public DateTime DT_INIC { get; set; }
    
        public string CD_EVNT { get; set; }
    }
    
    var results = session.GetNamedQuery("FnListEvnt")
        .SetDateTime("dt", DateTime.Now)
        .SetInt32("id", 4)
        .SetString("code", "code")
        .SetResultTransformer(Transformers.AliasToBean<Result>())
        .List<Result>();