現在、FormView のデータ ソースとして使用される ASP.NET ページに LinqDataSource があります。where
クエリ文字列を介して渡されるパラメーターに基づいて、句を動的に変更する必要があります。エンドユーザーがワイルドカードを使用できるようにすることを除いて、これは正常に機能しています。
- 「?」単一の文字を表すために使用されます。
- 「*」は複数の文字を表します。
簡単そうに見えますが、LIKE 演算子を使用して (1 文字に一致) および (すべての文字に一致) に置換するだけで済みます?
。_
*
%
以下は、派手なフットワーク ( で呼び出されるPageLoad
) を行うメソッドであり、ワイルドカードがエスケープされていることを除けば、うまく機能します。
private void ApplyFilter(ref LinqDataSource lds)
{
if (Request.QueryString.Keys.Count > 0)
{
string where = "";
int counter = 0;
foreach (string key in Request.QueryString.Keys)
{
if (Request.QueryString[key] != "")
{
if (counter == 0)
{
where += key + ".Contains(@" + key + ")";
}
else
{
where += " AND " + key + ".Contains(@" + key + ")";
}
lds.WhereParameters.Add(key, Request.QueryString[key].Replace("?", "_").Replace("*", "%"));
counter++;
}
}
if (where != "")
lds.Where = where;
}
}
以下は、このクエリ文字列から生成されるクエリです。.aspx?LOOP_DESCRIPTION=*&LOOP=*&AREA=01
exec sp_executesql N'SELECT [t1].[AREA], [t1].[LOOP], [t1].[LOOP DESCRIPTION] AS [LOOP_DESCRIPTION]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[AREA], [t0].[LOOP], [t0].[LOOP DESCRIPTION]) AS [ROW_NUMBER], [t0].[AREA], [t0].[LOOP], [t0].[LOOP DESCRIPTION]
FROM [dbo].[INSTRUMENT LOOP DESCRIPTION] AS [t0]
WHERE ([t0].[LOOP DESCRIPTION] LIKE @p0 ESCAPE ''~'') AND ([t0].[LOOP] LIKE @p1 ESCAPE ''~'') AND ([t0].[AREA] LIKE @p2)
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p3 + 1 AND @p3 + @p4
ORDER BY [t1].[ROW_NUMBER]',N'@p0 nvarchar(4000),@p1 nvarchar(4000),@p2 nvarchar(4000),@p3 int,@p4 int',@p0=N'%~%%',@p1=N'%~%%',@p2=N'%01%',@p3=0,@p4=1
パラメータの割り当てからわかるように、ワイルドカードはチルダ文字でエスケープされています。
@p0=N'%~%%',@p1=N'%~%%',@p2=N'%01%'
私の質問は、_
と%
文字がエスケープされるのを止めることは可能ですか?