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

使用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查询中使用它,还需要哪些步骤?

我实际上是在不久前编写了这个确切的函数。 我的通用目的有点多,但看起来像这样:

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