如何批量检索实体?

spo*_*f3r 5 c# azure azure-table-storage

在 Azure 表存储中,如何查询与分区中特定行键匹配的一组实体???

我正在使用 Azure 表存储,需要检索一组与分区内的一组行键匹配的实体。

基本上,如果这是 SQL,它可能看起来像这样:

SELECT TOP 1 SomeKey
FROM TableName WHERE SomeKey IN (1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

我想节省成本并减少做一堆表检索操作,我可以使用表批处理操作来完成。出于某种原因,我得到一个例外,说:

“具有检索操作的批处理事务不能包含任何其他操作”

这是我的代码:

public async Task<IList<GalleryPhoto>> GetDomainEntitiesAsync(int someId, IList<Guid> entityIds)
{
    try
    {
        var client = _storageAccount.CreateCloudTableClient();
        var table = client.GetTableReference("SomeTable");
        var batchOperation = new TableBatchOperation();
        var counter = 0;
        var myDomainEntities = new List<MyDomainEntity>();

        foreach (var id in entityIds)
        {
            if (counter < 100)
            {
                batchOperation.Add(TableOperation.Retrieve<MyDomainEntityTableEntity>(someId.ToString(CultureInfo.InvariantCulture), id.ToString()));
                ++counter;
            }
            else
            {
                var batchResults = await table.ExecuteBatchAsync(batchOperation);
                var batchResultEntities = batchResults.Select(o => ((MyDomainEntityTableEntity)o.Result).ToMyDomainEntity()).ToList();
                myDomainEntities .AddRange(batchResultEntities );
                batchOperation.Clear();
                counter = 0;
            }
        }

        return myDomainEntities;
    }
    catch (Exception ex)
    {
        _logger.Error(ex);
        throw;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在不手动遍历行键集并为每个行键执行单独的检索表操作的情况下实现我的目标?我不想承担与此相关的成本,因为我可能有数百个要过滤的行键。

Dav*_*gon 1

对于数百个行键,这就排除了使用$filter行键列表(无论如何这都会导致部分分区扫描)。

根据您收到的错误,该批处理似乎包含查询和其他类型的操作(这是不允许的)。从您的代码片段中,我不明白您为什么会收到该错误。

您唯一的其他选择是执行单独的查询。不过,您可以异步执行这些操作,因此不必等待每个操作返回。表存储在给定分区上每秒提供超过 2,000 个事务,因此它是一个可行的解决方案。