我的代码:
Dim dt As New DataTable
dt.Columns.Add("No")
dt.Columns.Add("Col2")
Dim dr = dt.NewRow
dr("No") = 1
dr("Col2") = "abc"
dt.Rows.Add(dr)
Dim strText="abcdes"
For Each drow As DataRow In dt.Select(String.Format("'{0}' like '%' & Col2 & '%'", strText))
//value of Col2 exist in strText
Next
显示错误:
{“表达式包含不受支持的运算符 '&'。“} System.Data.EvaluateException
如何在DataTable DotNet中选择像列一样的值?
答案 0 :(得分:1)
您应该使用+
代替&
并更正LIKE
的格式:
String.Format(" '{0}' LIKE '%' + Col2 + '%' ", strText)
对于每一行,这将检查Col2
中是否包含strText
的值,它是否返回该行。
要检查Col2
是否包含strText
,您应该使用String.Format("Col2 LIKE '%{0}%'", strText)
。
示例强>:
Dim foundRows() As DataRow
foundRows= dt.Select(String.Format(" '{0}' LIKE '%' + Col2 + '%' ", strText))
For Each dr As DataRow In foundRows
'Do something
Next
要了解有关表达式语法的更多信息:
注意:强>
如果您没有获取DataRow
列表,而是需要过滤DataTable
,例如仅显示DataGridView
中已过滤的行,请使用:
Me.DataGridView1.DataSource = dt
dt.DefaultView.RowFilter = String.Format("Col2 LIKE '%{0}%'", strText)
答案 1 :(得分:1)
在为LIKE条件构建正确的Filter值时,您必须处理特殊字符。
有一个例子here
public static string EscapeLikeValue(string valueWithoutWildcards)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < valueWithoutWildcards.Length; i++)
{
char c = valueWithoutWildcards[i];
if (c == '*' || c == '%' || c == '[' || c == ']')
sb.Append("[").Append(c).Append("]");
else if (c == '\'')
sb.Append("''");
else
sb.Append(c);
}
return sb.ToString();
}
正如其他人提到的,你的语法看起来很奇怪,试试
dt.Select(String.Format("col2 LIKE '%{0}%'", EscapeLikeValue(strText))
答案 2 :(得分:-1)
您是否尝试过执行dt.AsEnumerable()并使用LINQ函数?
在你的情况下你可以做类似的事情
var dataRows = dt.AsEnumerable();
var matchingRows = dataRows.Where(e=>e.Row<string>("Col2").Contains(strText)).Select();
这将返回一个IEnumerable,它包含所有包含strText
值的行阅读起来容易得多,而且更受欢迎。