如何从 Azure Functions 方法而不是属性内部查询 CosmosDB

Viv*_*ndi 5 azure-functions azure-cosmosdb

从文档中我了解到我可以通过在属性中指定查询来查询 CosmosDB,如下所示:

public static class DocByIdFromRouteDataUsingSqlQuery
{
    [FunctionName("DocByIdFromRouteDataUsingSqlQuery")]
    public static IActionResult Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", 
            Route = "todoitems2/{id}")]HttpRequest req,
        [CosmosDB("ToDoItems", "Items",
            ConnectionStringSetting = "CosmosDBConnection",
            SqlQuery = "select * from ToDoItems r where r.id = {id}")]
            IEnumerable<ToDoItem> toDoItems,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        foreach (ToDoItem toDoItem in toDoItems)
        {
            log.LogInformation(toDoItem.Description);
        }

        return new OkResult();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不想在我的属性中设置查询。我想在方法中做到这一点。我想if/else在对 CosmosDB 进行查询之前进行一些检查。

我找不到任何使用类似CosmosDbClient. 这样的事情存在吗?

所以基本上我的问题是,如何从我的方法内部而不是属性内部运行查询?

1_1*_*1_1 1

一个简单的代码即可满足您的要求:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using Azure.Cosmos;

namespace FunctionApp2
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            CosmosClient cosmosClient = new CosmosClient(Program.EndpointUrl, Program.AuthorizationKey);
            bool test = await QueryItemsAsync(cosmosClient);
            string a = "this is ...";
            if (test == true)
            {
                a = "Find the object.";
            }
            else {
                a = "Not find the object.";
            }
            return new OkObjectResult(a);
        }

        public static class Program
        {
            public const string EndpointUrl = "https://testbowman.documents.azure.com:443/";
            public const string AuthorizationKey = "KIOWEDdQQogxxxxxxcNRnPbsg==";

            public const string DatabaseId = "testbowman";
            public const string ContainerId = "testbowman";
        }
        private static async Task<bool> QueryItemsAsync(CosmosClient cosmosClient)
        {
            var sqlQueryText = "SELECT * FROM c WHERE c.LastName = 'Bowman'";

            Console.WriteLine("Running query: {0}\n", sqlQueryText);

            CosmosContainer container = cosmosClient.GetContainer(Program.DatabaseId, Program.ContainerId);

            QueryDefinition queryDefinition = new QueryDefinition(sqlQueryText);

            List<Family> families = new List<Family>();

            await foreach (Family family in container.GetItemQueryIterator<Family>(queryDefinition))
            {
                families.Add(family);
                Console.WriteLine("\tRead {0}\n", family);
            }

            if (families.Count > 0)
            {
                return true;
            }
            else {
                return false;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是文档:

https://learn.microsoft.com/en-us/azure/cosmos-db/create-sql-api-dotnet-v4#query-the-items