是否可以将 table t-sql表值用户定义的函数用作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查询的一部分 - 真正的查询更复杂它有fetch join等。
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);
我花了一些时间寻找答案,但没有结果。有可能吗?
提前谢谢。
答案 0 :(得分:0)
不,你不能在HQL中使用表值函数。
改为使用SQL(CreateSQLQuery(...)
)。
答案 1 :(得分:0)
也许有人会发现它很有用,我已经结束了以下查询
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 )并同时限制只有那些可供用户使用的项目 - &gt;这个逻辑位于我的表值UDF中。