c# - 将通配符与 LinqDataSource 一起使用

标签 c# asp.net .net linq linq-to-sql

我目前在 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]);

关于c# - 将通配符与 LinqDataSource 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11512539/

相关文章:

.net - 无法使用 Azure DevOps API 获取最新版本

c# - MVC4 WebApi 进程启动器

c# - 使用 Linq exceptBy 函数的泛型类中出现奇怪的编译器错误

c# - Linq2SQL生成的奇怪SQL

c# - 如何从 Web API JSON 响应派生 C# 动态对象?

c# - 如何在 HttpClient response.ReasonPhrase 中获取真正的错误消息?

c# - 类型 'System.Int32' 的表达式不能用于方法 'System.Object' 的类型 'Boolean Equals(System.Object)' 的参数

c# - updatePanel 不在单选按钮上刷新

c# - 在javascript函数中使用asp.net的图像组件

asp.net - w3wp.exe 对每个请求的 CPU 使用率都很高