Итеративная дизъюнкция в LINQ - PullRequest
1 голос
/ 28 мая 2019

Предположим, у меня есть коллекция IQuerable и список некоторых строк.

Я могу построить запрос следующим образом:

foreach (var somestring in somestrings)
{
     collection = collection.Where(col=>col.Property.Contains(somestring);
}

, который выдаст следующий запрос SQL:

SELECT ...... FROM ..... WHERE 
(Property LIKE '%something1%') AND 
(Property LIKE '%something2%') AND 
(Property LIKE '%something3%')

Обратите внимание, что предложения WHERE связаны с AND.

Есть ли способ построить аналогичный запрос, но связанный с OR?

Ответы [ 2 ]

3 голосов
/ 28 мая 2019

Вы можете сделать это в одном запросе без цикла, используя Any:

var result = collection
    .Where(col => somestrings
        .Any(s => col.Property.Contains(s)));

Или тот же запрос с упрощенным синтаксисом:

var result = collection
    .Where(col => somestrings
        .Any(col.Property.Contains));
1 голос
/ 28 мая 2019

Вы можете использовать PredicateBuilder, например this .См. SO для больше .

Здесь вы можете соединить запросы с помощью AND или OR.

IQueryable<Product> SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.False<Product>();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);
}

Образец взят из C # 7.0 в двух словах

Я успешно использовал это при реализации настраиваемых полей поиска

например.

[красный синий] -> ищет красный И синий

[красный, синий] -> ищет красный ИЛИ синий

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