Функция Azure для чтения из таблицы - PullRequest
1 голос
/ 02 июля 2019

Попытка написать функцию, которая вставляет элементы в таблицу Azure из функции (работает). Я хотел бы описать сценарий, в котором элемент уже существует - поэтому я хотел бы запросить / прочитать / выполнить таблицу, и если элемент не найден, вставьте:

public static async Task<IActionResult> Run(HttpRequest req, ILogger log, IAsyncCollector<StripeHookResponse> outputTable, IAsyncCollector<string> outputQueueItem)
{

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();

    try{

        if(WHAT_GOES_HERE)
        {
            await outputTable.AddAsync(MyItem); 
        }
    }
}

Я пытался outputTable.Execute TableOperation.Retrieve Но ничего не работает, и интеллигент в инструменте портала - мусор.

Поскольку это Async, вставка не может быть перехвачена в блоке Exception (). Есть идеи?

1 Ответ

2 голосов
/ 03 июля 2019

Используйте параметр метода CloudTable, чтобы получить ссылку на таблицу, с которой затем можно выполнять запросы и операции:

public class MyItem : TableEntity
{
}

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req,
    [Table("AzureWebJobsHostLogsCommon")] CloudTable cloudTable,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    MyItem myItem = JsonConvert.DeserializeObject<MyItem>(requestBody);

    // query the table - here I have used the partition key but you could replace "PartitionKey" with any column in your table
    TableQuery<MyItem> query = new TableQuery<MyItem>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, myItem.PartitionKey));
    IEnumerable<MyItem> entities = await cloudTable.ExecuteQuerySegmentedAsync(query, null);

    // if all items have a unique partition key and the item exists 
    // you should only get one item returned, if not it will be null (default)
    MyItem existingMyItem = entities.FirstOrDefault();

    // if the item is null, you want to insert it into the table
    if (existingMyItem == null)
    {
        // create an InsertOperation for your new item
        TableOperation insertOperation = TableOperation.Insert(myItem);
        await cloudTable.ExecuteAsync(insertOperation);
    }

    return new OkObjectResult("");
}

Редактировать : я просто перечиталвопрос и увидеть, что вы используете портал, поэтому я предполагаю, C # скрипт.Смотрите пример здесь https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-table#input---c-script-example---cloudtable - логика будет такой же.

...