如何注册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查询中使用它,还需要哪些步骤?
我实际上在一段时间之前编写了这个函数。我的是更通用的,但它看起来像这样:
[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函数保存在完全独立的程序集中,因为它们很少更改,而且使用数据的程序集是非常动态的。