слово соответствия linq с границами - PullRequest
1 голос
/ 08 мая 2009

скажем, у меня в базе данных есть поле nvarchar, которое выглядит так

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

мне нужен запрос select LINQ, который бы соответствовал слову "abc" с границами, не являющимися частью строки

в этом случае только строки 1 и 3 будут соответствовать

Ответы [ 4 ]

2 голосов
/ 08 мая 2009
from row in table.AsEnumerable()
where row.Foo.Split(new char[] {' ', '\t'}, StringSplitOptions.None)
    .Contains("abc")
select row

Важно включить вызов AsEnumerable, что означает, что запрос выполняется на стороне клиента, иначе (я уверен), условие Where не будет успешно преобразовано в SQL. *

0 голосов
/ 08 мая 2009

Для эффективности вы хотите выполнить как можно больше фильтрации на сервере, а затем выполнить остальную часть фильтрации на клиенте. Вы не можете использовать 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 на стороне клиента для дальнейшего ограничения набора результатов. так что включаются только совпадения, которые находятся на границах слов.

0 голосов
/ 08 мая 2009
datacontext.Table.Where(
         e => Regex.Match(e.field, @"(.*?[\s\t]|^)abc([\s\t].*?|$)")
);

или

datacontext.Table.Where(
         e => e.Split(' ', '\t').Contains("abc");
);
0 голосов
/ 08 мая 2009

Возможно регулярное выражение, подобное этому (nb - не скомпилировано и не протестировано):

var matches = from a in yourCollection
         where Regex.Match(a.field, ".*\sabc\s.*")
         select a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...