gpt4 book ai didi

c# - 如何在PartitionKey中使用单引号查询Azure表存储

转载 作者:太空狗 更新时间:2023-10-29 19:39:33 24 4
gpt4 key购买 nike

我正在将一些代码从较旧的 azure 表存储客户端迁移到最新版本,并且遇到了一个让我困惑的问题:我似乎无法在分区键中发送带有单引号的查询而不会收到 400错误的请求。例如:

public class TestEntity : TableEntity
{
public string TestProperty { get; set; }
}

public class StorageTester
{
public static void TestInsert()
{
CloudStorageAccount acct = CloudStorageAccount.DevelopmentStorageAccount;
CloudTableClient client = acct.CreateCloudTableClient();
CloudTable table = client.GetTableReference("testtable");
table.CreateIfNotExists();

// insert a test entity -- this works fine
TestEntity entity = new TestEntity();
entity.PartitionKey = "what's up";
entity.RowKey = "blah";
entity.TestProperty = "some dataz";

TableOperation op = TableOperation.Insert(entity);
table.Execute(op);

// now query the entity -- explicit query constructed for clarity
string partitionFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "what's up");
string rowFilter = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, "blah");
string finalFilter = TableQuery.CombineFilters(partitionFilter, TableOperators.And, rowFilter);

TableQuery<TestEntity> query = new TableQuery<TestEntity>().Where(finalFilter);

// THIS THROWS 400 ERROR, does not properly encode partition key
var entities = table.ExecuteQuery(query, new TableRequestOptions { RetryPolicy = new NoRetry() });
entity = entities.FirstOrDefault();

}
}

我已经尝试了一切...我尝试显式设置 TableQuery 的 FilterString 属性,但它在设置该属性后执行 URL 编码,因此如果我用 %27 替换单引号,% 会被双重转义。

有没有人有一种解决方法可以让我使用新的表存储库而无需回退到旧的 StorageClient 库?请注意,我现有的数据库中已有大量数据,因此“在查询中不要使用单引号”之类的解决方案绝对是最后的选择,因为它需要扫描和更新每个现有表中的每条记录-- 我想避免的维护任务。

最佳答案

您需要转义单引号,但仅在过滤时(通过在原始单引号之前添加单引号):

string partitionFilter = TableQuery.GenerateFilterCondition("PartitionKey", 
QueryComparisons.Equal, "what''s up");

这是因为 GenerateFilterConditionCombineFilters 将过滤器转换为简单的字符串(OData 格式):

(PartitionKey eq 'what''s up') and (RowKey eq 'blah')

使用过滤器的更安全方法如下:

string partitionFilter = TableQuery.GenerateFilterCondition("PartitionKey", 
QueryComparisons.Equal, partitionKey.Replace("'", "''"));

关于c# - 如何在PartitionKey中使用单引号查询Azure表存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13616323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com