说我的数据库中有一个nvarchar字段,看起来像这样
1, "abc abccc dabc"
2, "abccc dabc"
3, "abccc abc dabc"
我需要一个选择LINQ查询,该查询将匹配单词“abc”,边界不是字符串的一部分
在这种情况下,只有第1行和第3行匹配
答案 0 :(得分:2)
from row in table.AsEnumerable()
where row.Foo.Split(new char[] {' ', '\t'}, StringSplitOptions.None)
.Contains("abc")
select row
包含对AsEnumerable
的调用很重要,这意味着查询是在客户端执行的,否则(我很确定)Where
子句不会转换为SQL成功地
答案 1 :(得分:0)
也许像这样的正则表达式(nb - 未编译或测试):
var matches = from a in yourCollection
where Regex.Match(a.field, ".*\sabc\s.*")
select a;
答案 2 :(得分:0)
datacontext.Table.Where(
e => Regex.Match(e.field, @"(.*?[\s\t]|^)abc([\s\t].*?|$)")
);
或
datacontext.Table.Where(
e => e.Split(' ', '\t').Contains("abc");
);
答案 3 :(得分:0)
为了提高效率,您希望在服务器上尽可能多地进行过滤,然后在客户端上进行剩余的过滤。您不能在服务器上使用Regex(SQL Server不支持它),因此解决方案是首先使用LIKE类型搜索(通过调用.Contains)然后在客户端上使用Regex进一步细化结果:
db.MyTable
.Where (t => t.MyField.Contains ("abc"))
.AsEnumerable() // Executes locally from this point on
.Where (t => Regex.IsMatch (t.MyField, @"\babc\b"))
这确保您只检索SQL Server中的行而不是包含字母'abc'(无论它们是否是字边界匹配),并在客户端使用Regex来进一步限制结果集所以只包括字边界上的匹配。