Select 来自 Table 值函数 nhibernate
Select from Table Valued Function nhibernate
我需要一点帮助。
我正在尝试在 select 中使用 table 值函数,但我得到的错误是未映射。
dbo.FnListEvnt is not mapped [from 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
。那是为了注册标量函数。
但是,您可以创建命名查询并执行它。不过这涉及几个步骤:
创建命名查询 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>
如果您的查询 returns 是映射的 class(未映射的 class 将 不 工作),您可以使用 return-class
而不是 return-scalar
个元素的列表。
创建结果 class(除非您要返回映射的 class)。 请注意,您的 class' 属性 名称必须与结果集的列名称匹配:
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; }
}
使用GetNamedQuery
创建查询,然后设置参数并执行查询:
var results = session.GetNamedQuery("FnListEvnt")
.SetDateTime("dt", DateTime.Now)
.SetInt32("id", 4)
.SetString("code", "code")
.SetResultTransformer(Transformers.AliasToBean<Result>())
.List<Result>();
确实如此。您现在应该可以将 TVF 与 NHibernate 一起使用了。
我需要一点帮助。 我正在尝试在 select 中使用 table 值函数,但我得到的错误是未映射。
dbo.FnListEvnt is not mapped [from 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
。那是为了注册标量函数。
但是,您可以创建命名查询并执行它。不过这涉及几个步骤:
创建命名查询 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>
如果您的查询 returns 是映射的 class(未映射的 class 将 不 工作),您可以使用
return-class
而不是return-scalar
个元素的列表。创建结果 class(除非您要返回映射的 class)。 请注意,您的 class' 属性 名称必须与结果集的列名称匹配:
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; } }
使用
GetNamedQuery
创建查询,然后设置参数并执行查询:var results = session.GetNamedQuery("FnListEvnt") .SetDateTime("dt", DateTime.Now) .SetInt32("id", 4) .SetString("code", "code") .SetResultTransformer(Transformers.AliasToBean<Result>()) .List<Result>();
确实如此。您现在应该可以将 TVF 与 NHibernate 一起使用了。