如何从C#从Cosmos DB读取布尔值

时间:2019-02-26 20:53:51

标签: c# azure-cosmosdb

我在"scripts": { "start": "node ./server/index.js", "build": "react-scripts build", "dev": "yarn run build && yarn run serve", "test": "react-scripts test", "eject": "react-scripts eject", "heroku-postbuild": "yarn run build", "serve": "node ./server/index.js" }, 中有一些数据,其结构如下:

documentdb

我需要检查C#中使用{ id:1, key:"USA", states:["New York","New Jersey", "Ohio", "Florida" ] } 返回C的结果是否为“ California”。如何从CreateDocumentQuery中读取boolean的值?

1 个答案:

答案 0 :(得分:1)

假设您的DTO看起来像这样:

class Item
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("key")]
    public string Key { get; set; }

    [JsonProperty("states")]
    public List<string> States { get; set; }
}

您可以在数组上使用Contains方法来检查该值是否存在。 LINQ to SQL转换器将为您将其转换为sql查询。您要做的就是在where子句中添加任何其他谓词并运行它。我故意选择文档的ID,以节省一些RU,并使它运行得更快。

如果在where子句中存在的表达式中添加分区键,或者知道分区键的值,请在feed选项中进行设置以提高性能。确实不建议跨分区查询作为日常工作流程的一部分。

您可以使用DocumentQueryable的CountAsync()扩展方法来获取与谓词匹配的文档数,然后执行> 0以查看其是否存在。

这是代码:

public async Task<bool> ArrayContainsAsync()
{
    var documentClient = new DocumentClient(new Uri("https://localhost:8081"), "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==");
    var collectionUri = UriFactory.CreateDocumentCollectionUri("dbname", "collectionName");
    return (await documentClient
                      .CreateDocumentQuery<Item>(collectionUri, new FeedOptions { EnableCrossPartitionQuery = true })
                      .Where(x => x.States.Contains("California")).CountAsync()) > 0;
}

但是,下面的代码将控制查询并在第一次匹配时退出,这将比上面的代码更有效。

public async Task<bool> ArrayContainsAsync()
{
    var documentClient = new DocumentClient(new Uri("https://localhost:8081"), "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==");
    var collectionUri = UriFactory.CreateDocumentCollectionUri("dbname", "collectionName");
    var query = documentClient
        .CreateDocumentQuery<Item>(collectionUri, new FeedOptions { EnableCrossPartitionQuery = true })
        .Where(x => x.States.Contains("California")).Select(x=> x.Id).AsDocumentQuery();

    while (query.HasMoreResults)
    {
        var results = await query.ExecuteNextAsync();
        if (results.Any())
            return true;
    }

    return false;
}