AzureCosmos DB - реализация запроса с помощью функции .Contains () по массиву поисковых терминов - PullRequest
1 голос
/ 24 апреля 2020

Я запрашиваю Azure Cosmos DB и мне нужно применить фильтр на основе массива поисковых терминов. Примерно так:

 searchTerms = searchTerms.Where(s => s != null).Select(f => f.ToLower()).ToArray();
 query = query.Where(uci => searchTerms.Any(f => uci.User.FirstName.ToLower().Contains(f))
         || searchTerms.Any(f => uci.User.LastName.ToLower().Contains(f))
         || searchTerms.Any(f => uci.User.Company.Name.ToLower().Contains(f)));

Однако запрос не выполняется с ошибкой «Ввод не имеет типа IDocumentQuery». Таким образом, «Любой» не поддерживается Microsoft. Azure .Cosmos.

Альтернативой было использование запроса sql вместо linq. SQL имеет 2 параметра «Array_contains» или «Contains», но это не работает, потому что

  1. Array_contains выполняет проверку «=» элементов массива, а не проверку подстроки, например. SELECT ARRAY_CONTAINS (["яблоки", "клубника", "бананы"], "яблоки") AS b1

  2. Содержит произведения на одну строку, например. SELECT CONTAINS ("ab c", "ab") AS c1

cosmos array_contains

Эта ссылка говорит о ключевом слове «лайк», но оно также работает с одной строкой.

Ближайшее решение, которое я мог бы найти, ниже

searchTerms = searchTerms.Where(s => s != null).Select(f => f.ToLower()).ToArray();
foreach (string term in searchTerms) {
      query = query.Where(uci => uci.User.FirstName.ToLower().Contains(term)
      || uci.User.LastName.ToLower().Contains(term)
      || uci.User.Company.Name.ToLower().Contains(term));
   }

Это добавит «где» пункт для каждого поискового запроса, который является скорее взломом, чем решением. Кто-нибудь сталкивался с такой ситуацией? Любые оптимальные предложения?

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