使用 nhibernate t-sql 表值用户定义函数

Posted

技术标签:

【中文标题】使用 nhibernate t-sql 表值用户定义函数【英文标题】:using nhibernate t-sql table-valued user-defined functions 【发布时间】:2013-01-05 19:00:33 【问题描述】:

是否可以将 table t-sql table-valued user-defined 函数用作 HQL 查询的一部分?

这里Nhibernate filtering by user defined function output 是一个如何创建自定义方言扩展的示例,但在此示例中使用的是标量 UDF。

假设我有以下 t-sql UDT

CREATE FUNCTION [dbo].[getSuitableProjects]  
(
    @userID INT  
)  
RETURNS @result TABLE   
(  
    ProjectID INT  
)  
AS  
-- body of the function ..

我希望能够编写以下 hql - 第二行是伪代码,只是我想调用我的函数作为 hql 查询的一部分 - 真正的查询更复杂,它具有获取连接等。

StringBuilder hql = new StringBuilder();  
hql.AppendLine("select p from Projects p WHERE p.ProjectID IN");  
hql.AppendLine("(run with parameter -> getSuitableProjects(:userID))");

IQuery q = UOW.Session.CreateQuery(hql.ToString());  
q.SetInt32("userID", userID);

我花了一些时间寻找答案,但没有结果。有可能吗? 提前谢谢你。

【问题讨论】:

我有一个和你类似的疑问,看看这个链接***.com/questions/30812235/… 【参考方案1】:

不,您不能在 HQL 中使用表值函数。

改用 SQL (CreateSQLQuery(...))。

【讨论】:

【参考方案2】:

也许有人会觉得它有用,我以以下查询结束

var query = UOW.Session.QueryOver<Project>();
query = query.Where(...) //where  citeria which can be expressed in QueryOver
query = query.Fetch(z => z.Items).Eager.TransformUsing(Transformers.DistinctRootEntity);

var criteria = query.UnderlyingCriteria
.Add(Expression.Sql("alias.ID IN (SELECT ProjectID FROM dbo.getSuitableProjects(12))"))

我的目标是预加载项目 (z.Items) 并同时限制为仅可供用户使用的项目 -> 此逻辑位于我的表值 UDF 中。

【讨论】:

以上是关于使用 nhibernate t-sql 表值用户定义函数的主要内容,如果未能解决你的问题,请参考以下文章

用T-SQL语句自定义一表值函数

SqlDbType.Structured 在 NHibernate 中传递表值参数以选择不带:param?

T-SQL 多语句表值函数

在 T-SQL 查询的 SELECT 子句中使用表值函数的“语法不正确”

调用 T-SQL 表值函数比调用一次快多次?

等效于 Amazon Redshift 中的 T-SQL 表值构造函数?