CosmosDB文档客户端-如何隐式添加查询类型



我正在.NET Core 3.1中使用DocumentClient for Azure Cosmos DB。我的示例查询是:

var results = await _cosmosClient
.CreateDocumentQuery<Employee>(_documentCollectionUri, FeedOptionsProvider.DefaultOptions<Employee>())
.Where(x => x.IdentityId == identityId)
.AsDocumentQuery()
.GetResponse();

这段代码很有问题,因为如果数据库中有另一个具有传递条件的文档,但有另一种类型,那么响应将包含该对象。我知道lambda表达式仅限于泛型类型的公共属性,但是否有可能隐式添加检查类型正确性的内容?数据库对象具有类似Discriminator包含实体类型的属性,但在lambda表达式中不可见。我想要的行为是检查这个Discriminator属性的条件,而对象模型中没有这个属性。如何做到这一点?

您可以使用下面使用QueryDefinition类和container.GetItemQueryIterator方法的方法:

/// <summary>
/// Run a query (using Azure Cosmos DB SQL syntax) against the container
/// </summary>
private async Task QueryItemsAsync()
{
var sqlQueryText = "SELECT * FROM c WHERE c.Discriminator = 'Value' AND c.IdentityId = 'Id'";
Console.WriteLine("Running query: {0}n", sqlQueryText);
QueryDefinition queryDefinition = new QueryDefinition(sqlQueryText);
FeedIterator<Family> queryResultSetIterator = this.container.GetItemQueryIterator<Family>(queryDefinition);
List<Family> families = new List<Family>();
while (queryResultSetIterator.HasMoreResults)
{
FeedResponse<Family> currentResultSet = await queryResultSetIterator.ReadNextAsync();
foreach (Family family in currentResultSet)
{
families.Add(family);
Console.WriteLine("tRead {0}n", family);
}
}
}

在这里,您可以直接添加您的查询,该查询将根据Discriminator字段进行筛选。

有关实现的更多详细信息,您可以访问:教程:构建一个.NET控制台应用程序来管理Azure Cosmos DB SQL API帐户中的数据

最新更新