首页 > 解决方案 > AzureCosmos DB - 使用 .Contains() 功能对一组搜索词实施查询

问题描述

我正在查询 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(["apples", "strawberries", "bananas"], "apples") AS b1

  2. 包含在单个字符串上的作品,例如。选择包含(“abc”,“ab”)作为 c1

宇宙 array_contains

此链接谈到“like”关键字,但它也适用于单个字符串。

我能想出的最接近的解决方案如下

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));
   }

这将为每个搜索词添加一个“where”子句,这更像是一种技巧而不是解决方案。有没有人遇到过这种情况?有什么最佳建议吗?

标签: c#.netasp.net-coreazure-cosmosdbazure-cosmosdb-sqlapi

解决方案


推荐阅读