Я запрашиваю 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», но это не работает, потому что
Array_contains выполняет проверку «=» элементов массива, а не проверку подстроки, например. SELECT ARRAY_CONTAINS (["яблоки", "клубника", "бананы"], "яблоки") AS b1
Содержит произведения на одну строку, например. 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));
}
Это добавит «где» пункт для каждого поискового запроса, который является скорее взломом, чем решением. Кто-нибудь сталкивался с такой ситуацией? Любые оптимальные предложения?