linq匹配带边界的单词

时间:2009-05-08 08:32:05

标签: sql linq

说我的数据库中有一个nvarchar字段,看起来像这样

1, "abc abccc dabc"
2, "abccc dabc"
3, "abccc abc dabc"

我需要一个选择LINQ查询,该查询将匹配单词“abc”,边界不是字符串的一部分

在这种情况下,只有第1行和第3行匹配

4 个答案:

答案 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来进一步限制结果集所以只包括字边界上的匹配。