【问题标题】:How to escape characters in Azure Table queries?如何在 Azure 表查询中转义字符?
【发布时间】:2020-01-08 21:27:58
【问题描述】:

我想查询以 message 开头的列的行:metric="foo"

我尝试使用百分比和十六进制代码对=" 进行编码,但没有成功。

Microsoft 文档说必须对特殊字符进行编码,但没有说明如何编码:https://docs.microsoft.com/en-us/rest/api/storageservices/querying-tables-and-entities#query-string-encoding

当被比较的值包含特殊字符时,查询应该是什么样子?

【问题讨论】:

  • 您是否使用 sdk 进行查询?
  • 是否要使用参数“metric”来过滤结果
  • 我在 C# 中使用 Azure SDK。
  • @IgorGatis,如果您使用的是 azure sdk,那么 sdk 已经为您解决了难题,您可以在下面看到我的答案。如果不是这样,请向我们展示您的代码以及您正在使用哪些 nuget 包。
  • @IgorGatis,你好,只是想看看你现在能不能解决你的问题?

标签: azure azure-table-storage azure-tablequery


【解决方案1】:

如果您使用的是 azure sdk,那么 sdk 已经为您解决了难题。

在我的测试中,我使用的是最新的 azure table storage sdk Microsoft.Azure.Cosmos.Table,版本 1.0.4。

测试代码:

    static void Main(string[] args)
    {
        string connstr = "xxxx";
        var storageAccount = CloudStorageAccount.Parse(connstr);
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
        CloudTable table = tableClient.GetTableReference("myCustomer123");

        TableQuery<CustomerEntity> query = new TableQuery<CustomerEntity>();

        string myfilter = TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "ivan"),
                                  TableOperators.And,
                                  //for metric="foo", like below.                                      
                                  TableQuery.GenerateFilterCondition("PhoneNumber", QueryComparisons.Equal, "metric=\"foo\"")
                                  );

        query.FilterString = myfilter;

        var items = table.ExecuteQuery(query);

        foreach (var item in items)
        {
            Console.WriteLine(item.RowKey);
            Console.WriteLine(item.PhoneNumber);
        }

       Console.WriteLine("*****end******");
       Console.ReadLine();

    }

测试结果:

【讨论】:

    【解决方案2】:

    如果要使用参数过滤结果,可以使用?$filter=&lt;your parameter&gt;%20eq%20'&lt;vaule&gt;'。例如

    var date = DateTime.Now.ToUniversalTime().AddYears(1).ToString("R");
                var CanonicalizedResource = "/" + StorageAccountName + "/people";
                var StringToSign = date + "\n" + CanonicalizedResource;
                // List the containers in a storage account.
                // ListContainersAsyncREST(StorageAccountName, StorageAccountKey, CancellationToken.None).GetAwaiter().GetResult();
                var hmacsha = new HMACSHA256();
                hmacsha.Key = Convert.FromBase64String(StorageAccountKey);
             var sig=   hmacsha.ComputeHash(UTF8Encoding.UTF8.GetBytes(StringToSign));
                var sig1 = Convert.ToBase64String(sig);
    
                Console.WriteLine(sig1);
                String uri = "https://jimtestperfdiag516.table.core.windows.net/people" + "?$filter=PartitionKey%20eq%20'Jim'";
                HttpClient client = new HttpClient();
                var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri);
    
    
                httpRequestMessage.Headers.Add("x-ms-date", date);
    
                var str = "SharedKeyLite " + StorageAccountName + ":" + sig1;
                httpRequestMessage.Headers.TryAddWithoutValidation("Authorization", str);
                httpRequestMessage.Headers.Add("x-ms-version", "2017-04-17");
                httpRequestMessage.Headers.Add("Accept", "application/json;odata=fullmetadata");
                var results = client.SendAsync(httpRequestMessage).Result;
                var response = results.Content.ReadAsStringAsync().Result;
               var objs = JsonConvert.DeserializeObject(response);
    
    
                Console.WriteLine(objs);
    

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2012-03-26
      • 1970-01-01
      • 2016-03-10
      • 2017-09-06
      • 1970-01-01
      • 2018-02-06
      • 2013-05-02
      • 2011-05-09
      相关资源
      最近更新 更多