【问题标题】:CosmosDB Linq query with contains is not of type IDocumentQuery包含包含的 CosmosDB Linq 查询不是 IDocumentQuery 类型
【发布时间】:2019-06-03 12:41:24
【问题描述】:

我有一个使用 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;
    }
}

这适用于具有以下 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()
}

但是,使用 cosmonaut 库(从 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"')

而常规包含:

SELECT * FROM c WHERE CONTAINS(c.Name, "Test")

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

最好的问候

【问题讨论】:

  • 大家好,我是 Cosmonaut 开发人员。您可以粘贴完整的 Cosmonaut 查询 sn-p 以便我可以帮助您吗?当您构建不是来自 CosmosStore 的 Query() 方法的 IQueryable 时,将引发此错误。
  • 您好,尼克,感谢您的回复。它实际上只是像往常一样像 ICosmosStore 一样注入,然后从构造函数中抛出 _​​store。所以 .Query() 函数就在上面,并且类型为 IQueryable.

标签: c# linq azure-cosmosdb


【解决方案1】:

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

其次,Cosmos SQL API 中的CONTAINS 是字符串运算符,因此不能将其用于数组。

我想你正在寻找IN keyword

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

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

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

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

【讨论】:

  • 这就像一个魅力 - 我发誓我已经尝试过了,但我想旅程很长而且我的眼睛一直在欺骗。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 2012-04-16
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
相关资源
最近更新 更多