问题描述
我在.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