包含的CosmosDB Linq查询不是IDocumentQuery类型

wbgh16ku  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(109)

我有一个使用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组合。
问候

voase2hg

voase2hg1#

首先,你不应该混合使用T-SQL和Cosmos SQL API。Cosmos db有类似于SQL的查询语法,但它不支持T-SQL(它用于MS SQL)。
其次,Cosmos SQL API中的CONTAINS是一个字符串运算符,因此不能用于数组。
我想你正在寻找IN关键字。
所以实际上你需要下一个查询:

SELECT * FROM c WHERE (c.Name IN("Test", "Test2")) AND (c.Producer IN("Producer1", "Producer2"))

我没有使用cosmonaut库,但在Microsoft LINQ Provider for Document DB中,您的查询应该如下所示:

var data = yourQueryable.Where(x => producers.Contains(x.Producer) && names.Contains(x.Name)).ToList();

相关问题