2012-07-16 73 views
2

我目前在用作FormView數據源的ASP.NET頁面上有一個LinqDataSource。我需要根據通過查詢字符串傳遞的參數動態修改where子句。我有這個工作很好,但我希望最終用戶能夠使用通配符:對LinqDataSource使用通配符

  • 「?」用於表示單個字符。
  • 「*」代表多個字符。

似乎很容易,所有我需要做使用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%' 

我的問題是,是否可以阻止_%字符被轉義?

+0

請你可以告訴他們什麼時候得到了轉義 – HatSoft 2012-07-16 21:24:42

+0

就是這樣生成的查詢在框架中,它在內部的某個地方將其轉義出來。 – Hoff 2012-07-16 21:33:26

回答

0

我終於設法得到這個想通了。由於從this post一類,我能夠使用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; 
} 
0

請儘量URL解碼Request.QueryString[key]

例子:

HttpUtility.UrlDecode(Request.QueryString[key]); 
+0

我認爲你誤解了這個問題,它是生成的SQL中的參數值正在被轉義... – Hoff 2012-07-16 21:46:00

+0

@Hoff是否將查詢發回UI,因爲這可能導致轉義 – HatSoft 2012-07-16 21:47:43

+0

我使用的唯一代碼是在上面的例子。在PageLoad上調用ApplyFilter。 – Hoff 2012-07-16 21:59:53