使用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查询中使用它还需要哪些其他步骤?
答案 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");
}
你可能甚至能够将SqlFunction
和EdmFunction
属性放在同一个方法上,但我不推荐它(它似乎也推动了极限圆)。我更喜欢将我的CLR-UDF函数保存在一个完全独立的程序集中,因为它们很少更改,并且使用数据的程序集非常动态。