如何使用 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项目的平面层次结构