【问题标题】:Select from Table Valued Function nhibernate从表值函数中选择休眠
【发布时间】:2015-08-29 00:06:46
【问题描述】:

我需要一点帮助。 我正在尝试在选择中使用表值函数,但我得到了这个没有映射的错误。

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 中定义)

public class CustomFunctionsMsSql2008Dialect : MsSql2008Dialect
    {
        public CustomFunctionsMsSql2008Dialect()
        {
            RegisterFunction("dbo.FnListEvnt", new StandardSQLFunction("dbo.FnListEvnt", null));
        }
    }

查询

var query = Session.CreateQuery("from dbo.FnListEvnt(:dt, :id, :code) ")
                  .SetDateTime("dt", dt)
                  .SetInt32("id", id)
                  .SetString("code", code);

【问题讨论】:

  • 我很确定 RegisterFunction 只对 scalar 值的函数有用。您可能必须使用命名查询——这可以接受吗?

标签: c# sql-server nhibernate hql user-defined-functions


【解决方案1】:

您将无法为此使用RegisterFunction。那是为了注册标量函数。

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

  1. 创建命名查询 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>
    

    如果您的查询返回一个映射的类(未映射的类起作用),您可以使用return-class 而不是return-scalar 元素的列表。

  2. 创建一个结果类(除非您返回一个映射类)。 请注意,您的类的属性名称必须与结果集的列名匹配

    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; }
    }
    
  3. 使用GetNamedQuery创建查询,然后设置参数并执行查询:

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

原来如此。您现在应该可以将 TVF 与 NHibernate 一起使用。

【讨论】:

  • 这样的答案(我真的很喜欢,我喜欢;)让我感到更加绝望……NHibernate 时代已经结束……真可惜…… . 因为我们/他们可以用它做很多事情......
猜你喜欢
  • 2018-12-04
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
相关资源
最近更新 更多