我正在按照本指南使用 Azure 表:https://learn.microsoft.com/en-us/dotnet/api/overview/azure/data.tables-readme-pre,它使用 Azure.Data。表 NuGet 包。
我可以成功保存一行并在 Azure 门户内的存储资源管理器中查看它,但是当尝试执行简单查询时,我会返回:
Unhandled exception. Azure.RequestFailedException: Service request failed.
Status: 501 (Not Implemented)
Content:
{"odata.error":{"code":"NotImplemented","message":{"lang":"en-US","value":"The requested operation is not implemented on the specified resource.\nRequestId:0137da3a-f002-0031-19
d6-5234ab000000\nTime:2021-05-27T08:59:39.8919922Z"}}}
我的查询代码是:
var entities = _tableClient
.Query<TableEntity>(t => t.PartitionKey == PartitionKey)
.ToList();
我也遇到了这个确切的问题,虽然它似乎没有在任何地方记录,但以下内容对我有用:
var token = new DefaultAzureCredential();
var tableServiceClient = new TableServiceClient(new Uri($"https://{storageAccountName}.table.core.windows.net/"), token);
var client = tableServiceClient.GetTableClient(tableName);
var entities = client.Query<MyEntity>(filter: $"PartitionKey eq '{partKey}'");
我不太明白为什么直接创建TableClient:
new TableClient(new Uri($"https://{storageAccountName}.table.core.windows.net/{tableName}"), tableName, token);
不起作用,但首先通过 TableServiceClient 对我有用。尝试一下。
当我像这样创建客户端时,我在 java SDK 中遇到了这个问题:
new TableClientBuilder()
.endpoint("https://{storageAccountName}.table.core.windows.net/{tableName}")
.sasToken(sas)
.tableName(tableName)
.buildClient()
所以我做错的是将表名称作为端点的一部分并将其删除以停止异常。
OP 的问题是他们使用
==
而不是 eq
作为相等运算符,因为 ==
不是支持的查询比较运算符之一。
我有一个不同的问题,但有同样的错误,所以我想我会分享我的答案。更新到最新的
Azure.Data.Tables
NuGet 包后,我开始收到相同的错误,其中我收到如下错误:
状态:501(未实施)
错误代码:未实现
内容: {“odata.error”:{“code”:“NotImplemented”,“message”:{“lang”:“en-US”,“value”:“指定资源上未实现请求的操作。 请求 ID:ce4208b5-b002-0001-63f9-59956d000000 时间:2024-02-07T19:10:04.3685354Z"}}}
我的问题是我在查询过滤器中使用布尔值,如下所示:
filter += $" and (OperationSuccessful eq {parameters.Successful})";
其中
parameters.Successful
是布尔值。这导致了一个查询过滤器,如:
“(PartitionKey eq '某个分区键') 和 (成功 eq True)”
NuGet 包更新似乎引入了一项重大更改,其中查询现在区分大小写,因此将“True”和“False”大写会破坏查询。
解决方案是将代码更新为:
filter += $" and (OperationSuccessful eq {parameters.Successful.ToString().ToLower()})";
这导致查询看起来像这样:
“(PartitionKey eq '某些分区键') 和 (成功 eq true)”
虽然有点麻烦,但对我来说事情又重新开始了。