如何注册CLR用户定义函数以用于linq查询

本文关键字:函数 定义 用于 查询 linq 用户 CLR 何注册 注册 | 更新日期: 2023-09-27 18:06:25

使用SQL Server 2008,我想在比较数据库值之前运行一个正则表达式。

我正在研究CLR用户定义函数(我调查了EDM函数,但我得到的印象是udf更适合正则表达式-请纠正我,如果我错了)。

理想情况下,我希望像这样进行linq调用:

var results= db.Items.Where(i => i.CustomFormatFunction() == xyz);
到目前为止,我有这个c#代码:
public static partial class UserDefinedFunctions
{
    [SqlFunction]
    public static SqlString CustomFormatFunction(string str)
    {
        return Regex.Replace(Regex.Replace(HttpUtility.HtmlDecode(str), @"'s+", "-"), "[^a-zA-Z0-9/-]+", "").ToLower();
    }
}

为了能够在linq查询中使用它,还需要哪些步骤?

如何注册CLR用户定义函数以用于linq查询

我实际上在一段时间之前编写了这个函数。我的是更通用的,但它看起来像这样:

[SqlFunction(DataAccess = DataAccessKind.Read, IsDeterministic = true)]
public static string Replace(string input, string pattern, string replacement, int options)
{
    return Regex.Replace(input, pattern, replacement, (RegexOptions)options);
}

然后在SQL中注册为

CREATE ASSEMBLY [MyAssembly] 
FROM 'C:'Path'To'Assembly'MyAssembly.dll'
WITH PERMISSION_SET = SAFE
GO
CREATE FUNCTION [dbo].[Replace](@input [nvarchar](4000), @pattern [nvarchar](4000),  @replacement [nvarchar](4000), @options [int] = 0)
   RETURNS [nvarchar](4000) NULL
   WITH EXECUTE AS CALLER
   AS EXTERNAL NAME [MyAssembly].[MyNamespace.UserDefinedFunctions].[Replace]
GO

这将在SQL中创建CLR-UDF。我从未尝试将链接回到linq查询,但我认为它会像任何其他EDM函数一样工作。

[EdmFunction("dbo", "Replace")] 
public static string Replace(Replace input, pattern, replace, int flags) 
{ 
    throw new NotSupportedException("Direct calls not supported"); 
}

可能甚至可以将SqlFunctionEdmFunction属性放在相同的方法上,但我不建议这样做(这似乎也推动了循环的极限)。我更喜欢将CLR-UDF函数保存在完全独立的程序集中,因为它们很少更改,而且使用数据的程序集是非常动态的。