将 Like 语句与 DataView RowFIlter 一起使用

Using Like statement with DataView RowFIlter

我有一个包含一些数据的数据表,我想用 LIKE 查询进行过滤,所以我编写了如下代码,一切正常,我正在生成查询并将其传递给 RowFilter DataView 的对象。

if (results.Count() == 2)
{
    if (results[0].ToString() == "" && results[1].ToString() != "")
    {
        searchString = String.Format("[" + searchBy + "] LIKE '%{0}'", results[1].ToString());
    }
    else if (results[0].ToString() != "" && results[1].ToString() == "")
    {
       searchString = String.Format("[" + searchBy + "] LIKE '{0}%'", results[0].ToString());
    }
    else if (results[0].ToString() != "" && results[1].ToString() != "")
    {
       searchString = String.Format("[" + searchBy + "] LIKE '{0}%{1}'", results[0].ToString(), results[1].ToString());
    }
}

if (searchString != "")
{
     DataView dv = new DataView(AccountList.Tables[0]);
     dv.RowFilter = searchString;
     var tab = dv.ToTable();
     DataSet data_set = new DataSet();
     data_set.Tables.Add(tab);
     ProcessDataSetAndLoadData(data_set);
}

除了最后一个 else if 条件,上面的代码段工作正常,在那个条件下我得到这样的 searchString,

[AccountCode] LIKE 'c%l'

当我将其传递给 RowFilter 时,出现如下错误,

Error in Like operator: the string pattern 'c%l' is invalid.

在所有其他条件下,我得到如下所示的 searchString,并且这些条件工作正常。

[AccountCode] LIKE '%c%'
[AccountCode] LIKE 'c%'
[AccountCode] LIKE '%c

我的问题是为什么我只收到像这样的字符串的错误 ?。 [帐号] LIKE 'c%l'

请建议我完成任务。

在 DataView 过滤器中,字符串中间不允许使用通配符。

请参考这篇 MSDN 文章:https://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx 上面写着

通配符

在 LIKE 比较中,* 和 % 可以互换用于通配符。如果 LIKE 子句中的字符串包含 * 或 %,则这些字符应括在方括号 ([]) 中。如果子句中有方括号,则每个方括号字符都应括在方括号中(例如 [[] 或 []])。在模式的开头和结尾、模式的结尾或模式的开头允许使用通配符。例如:

"ItemName LIKE 'product'"

"ItemName LIKE '*product'"

"ItemName LIKE 'product*'"

字符串中间不允许使用通配符。例如,'te*xt' 是不允许的。

正如@KiranBeladiya 给我的建议,我生成了如下所示的 searchString,它工作正常,我得到了正确的输出,因此为了未来的观众而更新了答案。

searchString = String.Format("[" + searchBy + "] LIKE '"+ results[0].ToString() + "%' AND [" + searchBy + "] LIKE '" + "%" + results[1].ToString()+ "'");

返回的字符串如下所示,

[AccountCode] LIKE 'c%' AND [AccountCode] LIKE '%l'

因此,如果将此字符串传递给 RowFilter 对象,它将返回与以下字符串相同的输出。

[AccountCode] LIKE 'c%l'