如何使用逻辑应用程序中的“获取实体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)
有关如何实现这一目标的任何想法吗?
答案 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; }
}
<强>测试强>
有关Azure Functions存储表绑定的更多详细信息,请参阅here。
答案 1 :(得分:0)
azure表存储实体按字典顺序排序。因此,选择每次添加新实体时实际递减的行键,即。如果您的行键是一个整数,在创建新实体时会增加,而不是选择行键作为Int.Max - entity.RowKey。该分区键的最新实体将始终位于顶部,因为它将具有最低的行键,因此您只需使用分区键和Take(1)进行检索即可。如果您想了解更多相关内容,可以将其称为Log Tail模式。