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

问题描述

我在.NET Core 3.1中将DocumentClient用于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字段进行过滤的查询。

有关实施的更多详细信息,您可以访问:Tutorial: Build a .NET console app to manage data in Azure Cosmos DB SQL API account