C# 从表值函数nhibernate中选择
我需要一些帮助。 我试图在select中使用表值函数,但得到的错误是未映射 dbo.FnListEvnt未映射[来自dbo.FnListEvnt(:dt,:id,:code)] 作用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
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
。这是用来注册标量函数的
但是,您可以创建一个命名查询并执行它。但这涉及到几个步骤:
*.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>();