Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包含的CosmosDB Linq查询不是IDocumentQuery类型_C#_Linq_Azure Cosmosdb - Fatal编程技术网

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

C# 包含的CosmosDB Linq查询不是IDocumentQuery类型,c#,linq,azure-cosmosdb,C#,Linq,Azure Cosmosdb,我有一个和宇宙发展局合作的项目。起初我使用了EFCore的预览版,但它还不够成熟,所以我决定选择使用。我有一个linq语句,它基本上看两个属性是否包含一个子字符串列表-基本上我尝试做如下操作: SELECT * FROM c WHERE CONTAINS(c.Name, ListOfNames) AND CONTAINS(c.Producer, ListOfProducers); 或者一大堆: foreach(var name in nameList) { foreach(var pr

我有一个和宇宙发展局合作的项目。起初我使用了EFCore的预览版,但它还不够成熟,所以我决定选择使用。我有一个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;
    }
}
这可以通过以下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()
}
但在CosmosDB数据资源管理器中执行以下操作将产生0个结果:

SELECT * FROM c WHERE CONTAINS(c.Name, '"Test" OR "Test2"')
鉴于常规包含:

SELECT * FROM c WHERE CONTAINS(c.Name, "Test")
也许我的策略是错误的。我想把它结合起来的主要原因是为了有更好的性能。我的搜索域大约有100000个文档,其中我有一个多达1000个制作人+姓名的列表。所以基本上我想看看我是否能在我的文档列表中找到给定的producer+name组合


致以最诚挚的问候

首先,您不应该将T-SQL和Cosmos SQL API混用在一起。Cosmos db具有类似sql的查询语法,但不支持t-sql(它是针对MS sql的)

其次,
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();

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

其次,
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();

你好,我是宇航员开发者。你能粘贴完整的宇航员查询片段以便我能帮助你吗?当您构建IQueryable时会引发此错误,该IQueryable不是来自
CosmosStore
的Query()方法。您好,Nick,谢谢您的回复。它实际上只是像往常一样作为ICOSMStore注入,然后从构造函数抛出到存储中。所以.Query()函数就在上面,属于IQueryable类型。您好,我是宇航员开发者。你能粘贴完整的宇航员查询片段以便我能帮助你吗?当您构建IQueryable时会引发此错误,该IQueryable不是来自
CosmosStore
的Query()方法。您好,Nick,谢谢您的回复。它实际上只是像往常一样作为ICOSMStore注入,然后从构造函数抛出到存储中。因此,.Query()函数就在这上面,属于IQueryable类型。这就像一个符咒——我发誓我已经尝试过了,但我想这段旅程已经很长了,我的眼睛一直在欺骗。谢谢这就像一个符咒——我发誓我已经试过了,但我想这段旅程已经很长了,我的眼睛一直在欺骗。谢谢