如何使用 LINQ 针对 Azure Cosmos Document DB SQL API 有效地进行动态查询?

Posted

技术标签:

【中文标题】如何使用 LINQ 针对 Azure Cosmos Document DB SQL API 有效地进行动态查询?【英文标题】:How to effectively do dynamic query using LINQ against a Azure Cosmos Document DB SQL API? 【发布时间】:2021-08-20 06:33:40 【问题描述】:

我知道 Azure Cosmos DB SQL API 允许使用 SQL 语法从中查询文档并为我工作。

例如:SELECT * FROM c WHERE c.DynamicContent.MailingAddress.City LIKE '%PORT%' 运行良好。

我要保存的数据是这样的:


  "Id": 1001,
  "AttentionName": "Keyword list",
  "DynamicContent": 
    "Agency": 2,
    "EnteredOn": "2001-03-30T16:20:00+0000",
    "UpdatedOn": "2001-03-30T16:20:00+0000",
    "Name": "Sample Name",
    "MailingAddress": 
      "Address1": "501 Abbey St",
      "City": "Portland",
      "StateProvince": "OR",
      "PostalCode": "97215",
      "Country": "United States"
    
  

由于 DynamicContent 中的内容是非结构化和动态的,我使用下面的类来保存数据:

public partial class CosmosDocument

    [JsonProperty("Id")]
    public long Id  get; set; 

    [JsonProperty("AttentionName")]
    public string AttentionName  get; set; 

    [JsonProperty("DynamicContent")]
    public dynamic DynamicContent  get; set; 
 

我面临的问题是不能做这样的事情:

query.Where(c => c.DynamicContent.MailingAddress.City.Contains("PORT")).ToList();

因为过滤器中可能出现的属性(动态和 UI 控制)位于动态类中,并且不是强类型的。

有没有办法正确地做到这一点,或者至少有一些其他的解决方法来实现这一点? 请帮助您的想法。

【问题讨论】:

你试过对象表示法吗?像c.DynamicContent["MailingAddress"]["City"].Container("PORT") 这样的东西?请看这篇博文:blog.jeremylikness.com/blog/…。 是的,试过了。它给出了错误。 【参考方案1】:

与其使用 LINQ 进行查询,不如考虑使用QueryDefinition,它允许从任意字符串和参数值进行构造。 GetItemQueryIterator docs上有例子,比如:

QueryDefinition queryDefinition = new QueryDefinition("select * from ToDos t where t.cost > @expensive")
    .WithParameter("@expensive", 9000);
using (FeedIterator<ToDoActivity> feedIterator = this.Container.GetItemQueryIterator<ToDoActivity>(
    queryDefinition,
    null,
    new QueryRequestOptions()  PartitionKey = new PartitionKey("Error")))

    while (feedIterator.HasMoreResults)
    
        foreach(var item in await feedIterator.ReadNextAsync())
        
            Console.WriteLine(item.cost); 
        
    

【讨论】:

以上是关于如何使用 LINQ 针对 Azure Cosmos Document DB SQL API 有效地进行动态查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用代理从 Cosmos SDK .Net 连接到 Azure Cosmos?

Azure Cosmos SQL API - 如何将自定义对象存储为 @PartitionKey

如何使用 azure 流分析将 cosmos db 中的值更新为输出?

使用Cosmos Client返回Azure Cosmos项目的平面层次结构

如何配置我的 Azure Functions 环境,以便可以在 Python 代码中使用 Cosmos DB 客户端?

如何在 Python 中从 Azure 函数调用 Cosmos DB 存储过程?