【问题标题】:CosmosDB document client - how to implicit add type for query?CosmosDB 文档客户端 - 如何为查询隐式添加类型?
【发布时间】:2020-10-16 09:46:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net linq .net-core azure-cosmosdb


    【解决方案1】:

    您可以使用下面使用QueryDefinition Class 和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

    【讨论】:

    • 感谢您的回答,但您的解决方案并不理想。我有很多 ORM 设计支持的存储库,在每个存储库中我都必须在不使用 SQL 查询的情况下进行查询。我想将此鉴别器添加到使用扩展方法或类似方法由 LINQ 表达式生成的查询中。这可能吗?
    • 哦,如果是这样的话,你可以尝试在Employee对象中添加Discriminator并直接在LINQ中添加条件吗?
    • 另外,请在您的问题中提及,由于业务需求,您想使用此方法。
    • 我已经提到:我想要的行为是检查此“鉴别器”属性的条件,而对象模型中没有此属性。因此,我建议使用上述扩展方法,但这不是业务需求,仅在可能的情况下提出。我试图避免将 Discriminator 属性添加到 Employee 对象,因为我不想在域对象中拥有其类型名称的属性。
    • 如果不将其添加到类中,则无法实现此条件。
    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多