使用带有LinqDataSource的通配符

我目前在ASP.NET页面上有一个LinqDataSource,它用作FormView的数据源。 我需要根据通过查询字符串传递的参数动态更改where子句。 我有这个工作正常,除了我希望最终用户能够使用通配符:

  • 一个 ”?” 用于表示单个字符。
  • “*”表示多个字符。

看起来很简单,我需要做的就是使用LIKE运算符并替换? with _ (匹配单个字符), * with % (匹配所有字符)。

下面是执行花式步法(在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; }