C# 对LinqDataSource使用通配符

C# 对LinqDataSource使用通配符,c#,asp.net,.net,linq,linq-to-sql,C#,Asp.net,.net,Linq,Linq To Sql,我目前在ASP.NET页面上有一个LinqDataSource,用作FormView的数据源。我需要根据通过查询字符串传递的参数动态修改where子句。除了我希望最终用户能够使用通配符之外,我还可以很好地完成这项工作: A.用于表示单个字符。 A*表示多个字符。 看起来很简单,我需要做的就是使用LIKE运算符并替换?与uu匹配单个字符,与*匹配所有字符 下面是一个在PageLoad上调用的方法,该方法可以完成奇妙的步法,除了我的通配符被转义之外,它的效果非常好 private void Appl

我目前在ASP.NET页面上有一个LinqDataSource,用作FormView的数据源。我需要根据通过查询字符串传递的参数动态修改where子句。除了我希望最终用户能够使用通配符之外,我还可以很好地完成这项工作:

A.用于表示单个字符。 A*表示多个字符。 看起来很简单,我需要做的就是使用LIKE运算符并替换?与uu匹配单个字符,与*匹配所有字符

下面是一个在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\u DESCRIPTION=*&LOOP=*&AREA=01

正如您在参数赋值中看到的,我的通配符将使用波浪号字符进行转义:

@p0=N'%~%%',@p1=N'%~%%',@p2=N'%01%'
我的问题是,是否可以阻止转义u和%字符?

请尝试url解码请求。QueryString[key]

例如:

HttpUtility.UrlDecode(Request.QueryString[key]);
请尝试url解码请求。查询字符串[键]

例如:

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;
}

我终于弄明白了。由于中的一个类,我能够使用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;
}

你能告诉我他们什么时候逃逸吗?这是框架生成的查询,在内部某个地方逃逸。你能告诉我他们什么时候逃逸吗?这是框架生成的查询,在内部某个地方逃逸。我想你误解了这个问题,正在转义的是生成的SQL中的参数值…@Hoff您是否将查询发回UI,因为这可能导致转义?我使用的唯一代码在上面的示例中。在PageLoad上调用ApplyFilter。我想您误解了这个问题,是生成的SQL中的参数值被转义…@Hoff您是否将查询发回UI,因为这可能导致转义我使用的唯一代码在上面的示例中。在PageLoad上调用ApplyFilter。