c# - 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”,但这不起作用,因为
Array_contains 对数组元素执行“=”检查,而不是子字符串检查,例如。SELECT ARRAY_CONTAINS(["apples", "strawberries", "bananas"], "apples") AS b1
包含在单个字符串上的作品,例如。选择包含(“abc”,“ab”)作为 c1
此链接谈到“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”子句,这更像是一种技巧而不是解决方案。有没有人遇到过这种情况?有什么最佳建议吗?
解决方案
推荐阅读
- java - 在不允许 getEnv 调用的受保护环境中创建 AmazonHttpClient
- reactjs - VS Code:React 应用的编译时间长
- c++ - 为什么循环这个数组时我的代码不能正常工作
- kubernetes - 如何在命令行上替换 Helm values.yaml 中数组项中的特定属性值而不是整个数组/映射?
- sql - SQL Group by,但如果值相同则允许重复
- dart - 使用 Dart 中的 map() 等内置方法将嵌套列表(二维列表)转换为一个元素列表
- c++ - 重载索引运算符在 C++ 中不起作用
- android - 将回收站视图中显示的选中复选框的项目保存在列表中
- docker - 如何在 docker 上的 juypter 上的 pyspark 上的 spark 上启动 graphframes?
- javascript - React Material-UI 获取检查的项目列表