我有一个使用CosmosDB的项目。起初我使用的是EFCore的预览版,但它还不够成熟,所以我决定选择Cosmonaut。我有一个linq语句,它基本上看两个属性是否包含一个子字符串列表-基本上我试图做这样的事情:
SELECT * FROM c WHERE CONTAINS(c.Name, ListOfNames) AND CONTAINS(c.Producer, ListOfProducers);
或者是一大群:
foreach(var name in nameList) {
foreach(var producer in producerList){
SELECT * FROM c WHERE c.Name == searchedName AND c.Producer == searchedProducer;
}
}
这适用于EFCore SQL适配器和以下Linq Query:
public async void Search(List<string> producers, List<string> names){
await _store.Entity.Where(x => producers.Any(p => x.Producer.Contains(p)) && names.Any(w => x.Name.Contains(w))).ToListAsync()
}
然而,这与cosmonaut库(它 Package 了来自cosmos的DocumentDB客户端)给出了以下例外:Input is not of type IDocumentQuery
看看specs for Contains,我可以这样做:
USE AdventureWorks2012;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, '"chain*" OR "full*"');
GO
但在CosmosDB数据浏览器中执行以下操作会产生0个结果:
SELECT * FROM c WHERE CONTAINS(c.Name, '"Test" OR "Test2"')
而常规的contains可以:
SELECT * FROM c WHERE CONTAINS(c.Name, "Test")
也许我的策略是错误的。我想把它结合起来的主要原因是为了有更好的性能。我的搜索域大约有100.000个文档,其中我有一个多达1000个生产者+名称的列表。所以基本上我想看看我是否能在我的文档列表中找到给定的producer + name组合。
问候
1条答案
按热度按时间voase2hg1#
首先,你不应该混合使用T-SQL和Cosmos SQL API。Cosmos db有类似于SQL的查询语法,但它不支持T-SQL(它用于MS SQL)。
其次,Cosmos SQL API中的
CONTAINS
是一个字符串运算符,因此不能用于数组。我想你正在寻找
IN
关键字。所以实际上你需要下一个查询:
我没有使用cosmonaut库,但在Microsoft LINQ Provider for Document DB中,您的查询应该如下所示: