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

时间:2013-03-27 21:34:01

标签: c# linq sql-server-2008-r2 clr

使用SQL Server 2008我想在比较之前对DB值运行正则表达式。

我正在研究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查询中使用它还需要哪些其他步骤?

1 个答案:

答案 0 :(得分:1)

我实际上在不久前编写了这个确切的功能。我的通用目的更为普遍,但看起来像这样:

[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。我从未尝试将 back 链接到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函数保存在一个完全独立的程序集中,因为它们很少更改,并且使用数据的程序集非常动态。