微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

列出 Azure 表值

如何解决列出 Azure 表值

我有一个问题,这可能很愚蠢,但我花了将近一周的时间来解决。我想用 http 触发器创建 Azure 函数,它会检查请求的 URL 是否在 Azure 表中,如果这样的 url 存在,它将重定向到另一个 url,例如给定数据库记录中的 3 个值。重定向过程和当记录匹配时从数据库中检索数据的过程我正在工作,唯一的问题是如何从给定的行中获取特定值。 如何获取属性值?将“数据”转换为列表不起作用。

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 Microsoft.Azure.Cosmos.Table;
using System.Linq;
using static System.Environment;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net;
using System.Collections.Generic;

namespace Company.Function
{
    public static class Redirect2
    {
        [FunctionName("Redirect2")]
        public static async Task<IActionResult> GetAll(
        [HttpTrigger(AuthorizationLevel.Function,"get",Route = "todo")] HttpRequest req,[Table("tablename",Connection = "AzureWebJobsstorage")] CloudTable cloudTable,ILogger log)
    {
        string OriginUrl = "test.domain.com";

        TableQuery<TodoTable> query = new TableQuery<TodoTable>().Where(
        TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey",QueryComparisons.Equal,OriginUrl),TableOperators.Or,TableQuery.GenerateFilterCondition("RowKey",OriginUrl)));  

        var segment =  cloudTable.ExecuteQuery(query);
        var data = segment.Select(TodoExtensions.ToTodo);

        return new OkObjectResult(data);

    }
    }

}

public class TodoTable : TableEntity
{
    public string URL { get; set; }

    public string wwwURL { get; set; } 

    public string ClientURL { get; set; }
}

public class Todo
{
    public string URL { get; set; }

    public string wwwURL { get; set; } 

    public string ClientURL { get; set; }
}

public static class TodoExtensions
{
    public static TodoTable ToTable(this Todo todo)
    {
        return new TodoTable
        {
            PartitionKey = todo.URL,RowKey = todo.wwwURL,ClientURL = todo.URL
        };
    }

    public static Todo ToTodo(this TodoTable todoTable)
    {
        return new Todo
        {
            URL = todoTable.PartitionKey,wwwURL = todoTable.RowKey,ClientURL = todoTable.URL
        };
    }
}

解决方法

你搞砸了分区

 TableQuery<TodoTable> query = new TableQuery<TodoTable>().Where(
    TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey",QueryComparisons.Equal,OriginUrl),TableOperators.Or,TableQuery.GenerateFilterCondition("RowKey",OriginUrl)));  

所以在这里你尝试通过 rowKey 或 partitionKey 进行匹配,这将是昂贵的,因为它需要通过表存储中的所有数据。您真正想做的是始终查询单个分区。

所以我建议你做的是将 PartitionKey 设置为“默认”。然后你总是查询单个分区。

如果我正确理解您的代码以使您的代码正常工作,您应该这样做

public static async Task<IActionResult> GetAll(
        [HttpTrigger(AuthorizationLevel.Function,"get",Route = "todo")]
        HttpRequest req,[Table("tablename",Connection = "AzureWebJobsStorage")]
        CloudTable cloudTable,ILogger log)
    {
        string OriginUrl = req.Host.Value;

         TableQuery<TodoTable> query = new TableQuery<TodoTable>().Where(
            TableQuery.CombineFilters(
                TableQuery.GenerateFilterCondition(nameof(TableEntity.PartitionKey),TableOperators.And,TableQuery.GenerateFilterCondition(nameof(TableEntity.RowKey),OriginUrl)))
            .Take(1);

        var segment = cloudTable.ExecuteQuery(query);
        var data = segment.Select(TodoExtensions.ToTodo).FirstOrDefault();

         return new OkObjectResult(new { url = data?.URL});

    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。