1

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 クエリで使用できるようにするには、さらにどのような手順が必要ですか?

4

1 に答える 1

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 が作成されます。linq クエリにリンクしようとしたことはありません、他の EDM 関数と同じように機能すると思います。

[EdmFunction("dbo", "Replace")] 
public static string Replace(Replace input, pattern, replace, int flags) 
{ 
    throw new NotSupportedException("Direct calls not supported"); 
}

同じメソッドに属性を設定することもできるかもしれませんが、お勧めしません (循環性の限界を押し上げているようにも見えます)。私は、CLR-UDF 関数を完全に別のアセンブリに保持することを好みます。これは、CLR-UDF 関数が変更される頻度が非常に低く、データを使用するアセンブリが非常に動的であるためです。SqlFunctionEdmFunction

于 2013-03-27T22:43:07.523 に答える