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

Den*_*nis 3 c# linq azure-cosmosdb

我有一个使用 CosmosDB 的项目。起初我使用 EFCore 的预览版,但它确实不够成熟,所以我决定选择Cosmonaut。我有一个 linq 语句,它基本上查看两个属性是否包含子字符串列表 - 基本上我正在尝试执行以下操作:

SELECT * FROM c WHERE CONTAINS(c.Name, ListOfNames) AND CONTAINS(c.Producer, ListOfProducers);
Run Code Online (Sandbox Code Playgroud)

或者一大堆:

foreach(var name in nameList) {
    foreach(var producer in producerList){

        SELECT * FROM c WHERE c.Name == searchedName AND c.Producer == searchedProducer;
    }
}
Run Code Online (Sandbox Code Playgroud)

这与具有以下 Linq 查询的 EFCore SQL 适配器配合使用:

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()
}
Run Code Online (Sandbox Code Playgroud)

然而,使用 cosmonaut 库(它包装了 cosmos 中的 DocumentDB 客户端)会出现以下异常:

Input is not of type IDocumentQuery

查看Contains 的规格我可以这样做:

USE AdventureWorks2012;  
GO  
SELECT Name  
FROM Production.Product  
WHERE CONTAINS(Name, '"chain*" OR "full*"');  
GO
Run Code Online (Sandbox Code Playgroud)

但在 CosmosDB 数据浏览器中执行以下操作会产生 0 结果:

SELECT * FROM c WHERE CONTAINS(c.Name, '"Test" OR "Test2"')
Run Code Online (Sandbox Code Playgroud)

而常规包含则:

SELECT * FROM c WHERE CONTAINS(c.Name, "Test")
Run Code Online (Sandbox Code Playgroud)

也许我的策略是错误的。我想结合它的主要原因是为了获得更好的性能。我的搜索域大约有 100.000 个文档,其中包含最多 1000 个制作人 + 名称的列表。所以基本上我想看看是否可以在我的文档列表中找到给定的制作人+名称组合。

此致

Rom*_*ada 6

首先,您不应该混合使用 T-SQL 和 Cosmos SQL API。Cosmos db 具有类似 sql 的查询语法,但不支持 T-SQL(它适用于 MS SQL)。

其次,CONTAINSCosmos SQL API中是一个字符串运算符,因此不能将其用于数组。

我认为您正在寻找IN 关键字

所以实际上你需要下一个查询:

SELECT * FROM c WHERE (c.Name IN("Test", "Test2")) AND (c.Producer IN("Producer1", "Producer2"))
Run Code Online (Sandbox Code Playgroud)

我没有使用 cosmonaut 库,但在文档 DB 的 Microsoft LINQ 提供程序中,您的查询应如下所示:

var data = yourQueryable.Where(x => producers.Contains(x.Producer) && names.Contains(x.Name)).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 这就像一种魅力——我发誓我已经尝试过了,但我想这段旅程很漫长,而且我的眼睛也欺骗了我。谢谢! (2认同)