微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。