LINQ: Строка строки Entity содержит любой массив строк
Я хочу получить коллекцию объектов 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
Я уже рассмотрел этот похожий вопрос, но не смог заставить его работать.
Ответы
Ответ 1
Поскольку вы хотите увидеть, содержит ли поиск слово, содержащееся в описании p, вам в основном нужно проверить каждое значение в поиске, если оно содержится в описании p
result = from p in products
where search.Any(val => p.Description.Contains(val))
select p;
Это синтаксис С# для лямбда-метода, так как мой vb не настолько велик
Ответ 2
Dim result = From p in products _
Where search.Any(Function(s) p.Description.Contains(s))
Select p
Ответ 3
Вы можете использовать простой запрос LINQ, если вам нужно только проверить подстроки:
var q = words.Any(w => myText.Contains(w));
// returns true if myText == "This password1 is weak";
Если вы хотите проверить целые слова, вы можете использовать регулярное выражение:
-
Совпадение с регулярным выражением, которое является дизъюнкцией всех слов:
// 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);
-
Разделение строки на слова с регулярным выражением и тестирование для членства в коллекции слов (это будет быстрее, если вы используете 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)));
Ans From = > Как проверить, не найдено ли какое-либо слово в моем списке <string> содержится в тексте @R. Мартинхо Фернандес