带有表存储的azure logic app获取最后一个rowKey

时间:2017-11-08 00:28:27

标签: azure-table-storage azure-logic-apps

如何使用逻辑应用程序中的“获取实体Azure表存储”连接器返回最后一个rowKey。

这将用于每次添加新实体时rowkey表示整数递增的情况。我认识到这个设计中的缺陷,但这个问题是关于如何在Logic应用程序中使用某种where子句或最后条件。

目前,Logic App代码视图代码段如下所示:

"actions": {
        "Get_entity": {
            "inputs": {
                "host": {
                    "connection": {
                        "name": "@parameters('$connections')['azuretables']['connectionId']"
                    }
                },
                "method": "get",
                "path": "/Tables/@{encodeURIComponent('contactInfo')}/entities(PartitionKey='@{encodeURIComponent('a')}',RowKey='@{encodeURIComponent('b')}')"
            },
            "runAfter": {},
            "type": "ApiConnection"
        }

我有硬编码的地方:

RowKey='@{encodeURIComponent('b')}'

如果我总是想要这个rowKey,这很好。我想要的是最后一个rowKey,所以有点像:

RowKey= last(RowKey)

有关如何实现这一目标的任何想法吗?

2 个答案:

答案 0 :(得分:1)

  

如果我总是想要这个rowKey,这很好。我想要的是最后一个rowKey,所以有点像:RowKey = last(RowKey)

AFAIK,没有用于实现此目的的内置函数。我假设您可以使用 Azure Functions 连接器来检索新的RowKey值。以下是详细步骤,您可以参考它们:

为了测试,我创建了一个C#Http Trigger函数,然后添加了一个Azure Table Storage Input,然后检索特定PartitionKey下的所有项目,然后按RowKey排序并计算新的Row Key。

<强> function.json:

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "table",
      "name": "inputTable",
      "tableName": "SampleTable",
      "take": 50,
      "connection": "AzureWebJobsDashboard",
      "direction": "in"
    }
  ],
  "disabled": false
}

<强> run.csx:

#r "Microsoft.WindowsAzure.Storage"
using Microsoft.WindowsAzure.Storage.Table;
using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, IQueryable<SampleTable> inputTable,TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    // parse query parameter
    string pk = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "pk", true) == 0)
        .Value;
    // Get request body
    dynamic data = await req.Content.ReadAsAsync<object>();
    // Set name to query string or body data
    pk = pk ?? data?.pk;

    if(pk==null)
       return req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a pk on the query string or in the request body");
    else
    {
       var latestItem=inputTable.Where(p => p.PartitionKey == pk).ToList().OrderByDescending(i=>Convert.ToInt32(i.RowKey)).FirstOrDefault();
       if(latestItem==null)
          return  req.CreateResponse(HttpStatusCode.OK,new{newRowKey=1});
       else
          return  req.CreateResponse(HttpStatusCode.OK,new{newRowKey=int.Parse(latestItem.RowKey)+1});  
    }   
}

public class SampleTable : TableEntity
{
    public long P1 { get; set; }
    public long P2 { get; set; }
}

<强>测试

enter image description here

有关Azure Functions存储表绑定的更多详细信息,请参阅here

答案 1 :(得分:0)

azure表存储实体按字典顺序排序。因此,选择每次添加新实体时实际递减的行键,即。如果您的行键是一个整数,在创建新实体时会增加,而不是选择行键作为Int.Max - entity.RowKey。该分区键的最新实体将始终位于顶部,因为它将具有最低的行键,因此您只需使用分区键和Take(1)进行检索即可。如果您想了解更多相关内容,可以将其称为Log Tail模式。