如何注册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"); }
您甚至可以将SqlFunction
和EdmFunction
属性放在同一个方法上,但我不推荐它(它似乎也在推动循环的极限)。 我更喜欢将我的CLR-UDF函数保存在一个完全独立的程序集中,因为它们很少更改,并且使用数据的程序集非常动态。