[英]Using wildcards with a LinqDataSource
我目前在ASP.NET頁上有一個LinqDataSource,它用作FormView的數據源。 我需要根據通過查詢字符串傳遞的參數動態更改where
子句。 除了我希望最終用戶能夠使用通配符之外,我的工作還不錯:
似乎很容易,我需要使用LIKE運算符進行替換?
與_
(匹配單個字符),和*
與%
(匹配所有字符)。
下面是執行花式步法的方法(在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%'
我的問題是,是否可以阻止_
和%
字符被轉義?
請嘗試url解碼Request.QueryString[key]
例:
HttpUtility.UrlDecode(Request.QueryString[key]);
我終於設法弄清楚了。 由於從類這篇文章 ,我能夠使用LinqDataSource_Selecting事件,並使用此代碼工作通配符成功篩選我的數據:
protected void ldsData_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
var result = db.INSTRUMENT_LOOP_DESCRIPTIONs.AsQueryable();
foreach (string key in Request.QueryString.Keys)
{
if (Request.QueryString[key].Trim() != "")
{
result = result.WhereLike(key, Request.QueryString[key].Replace("?", "_").Replace("*", "%"));
}
}
e.Result = result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.