如何在 Azure 表查询中转义字符?
Posted
技术标签:
【中文标题】如何在 Azure 表查询中转义字符?【英文标题】:How to escape characters in Azure Table queries? 【发布时间】: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,你好,只是想看看你现在能不能解决你的问题? 【参考方案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=<your parameter>%20eq%20'<vaule>'
。例如
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);
【讨论】:
以上是关于如何在 Azure 表查询中转义字符?的主要内容,如果未能解决你的问题,请参考以下文章