LINQ: строковое поле Entity содержит любой массив строк - PullRequest
37 голосов
/ 18 ноября 2009

Я хочу получить коллекцию сущностей Product, в которой свойство product.Description содержит любое слово в массиве строк.

Это выглядело бы примерно так (в результате любой продукт, который имел бы в тексте описания слово "горчица ИЛИ" или "приправа"):

Dim products As List(Of ProductEntity) = New ProductRepository().AllProducts

Dim search As String() = {"mustard", "pickles", "relish"}

Dim result = From p In products _
     Where p.Description.Contains(search) _
     Select p

Return result.ToList

Я уже посмотрелна этот похожий вопрос , но не смог заставить его работать.

Ответы [ 3 ]

89 голосов
/ 18 ноября 2009

Так как вы хотите увидеть, содержит ли поиск слово, содержащееся в описании p, вам необходимо проверить каждое значение в поиске, если оно содержится в описании p

result = from p in products
           where search.Any(val => p.Description.Contains(val))
           select p;

Это синтаксис c # для лямбда-метода, так как мой vb не так хорош

6 голосов
/ 18 ноября 2009
Dim result = From p in products _
             Where search.Any(Function(s) p.Description.Contains(s))
             Select p
4 голосов
/ 12 июля 2013

Вы можете использовать простой запрос LINQ, если все, что вам нужно, это проверить подстроки:

var q = words.Any(w => myText.Contains(w));
// returns true if myText == "This password1 is weak";

Если вы хотите проверить целые слова, вы можете использовать регулярное выражение:

  1. Соответствие регулярному выражению, которое является дизъюнкцией всех слов:

    // you may need to call ToArray if you're not on .NET 4
    var escapedWords = words.Select(w => @"\b" + Regex.Escape(w) + @"\b");
    // the following line builds a regex similar to: (word1)|(word2)|(word3)
    var pattern = new Regex("(" + string.Join(")|(", escapedWords) + ")");
    var q = pattern.IsMatch(myText);
    
  2. Разделение строки на слова с регулярным выражением и проверка на членство в коллекции слов (это будет быстрее, если вы используете make слов в HashSet вместо List):

    var pattern = new Regex(@"\W");
    var q = pattern.Split(myText).Any(w => words.Contains(w));
    

Чтобы отфильтровать набор предложений по этому критерию, все, что вам нужно сделать, поместить его в функцию и вызвать Where:

 // Given:
 // bool HasThoseWords(string sentence) { blah }
 var q = sentences.Where(HasThoseWords);

Или положить в лямбду:

 var q = sentences.Where(s => Regex.Split(myText, @"\W").Any(w => words.Contains(w)));

Ответ от => Как проверить, содержится ли какое-либо слово в моем списке в тексте от @R. Мартиньо Фернандес

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...