You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中获取DynamoDB表的所有分区键列表

在C#中高效获取DynamoDB表的所有分区键列表

核心思路

因为你的表没有排序键且分区键唯一,不需要全量拉取数据,只需通过Scan操作并指定投影表达式仅返回分区键,就能高效获取所有唯一的分区键列表,避免不必要的数据传输。

前置依赖

先安装AWS SDK for .NET的DynamoDB包:

# NuGet包管理器命令
Install-Package AWSSDK.DynamoDBv2

# 或.NET CLI命令
dotnet add package AWSSDK.DynamoDBv2

实现方案

方案1:使用低级别AmazonDynamoDBClient(灵活可控)

适合需要精细控制扫描参数的场景,自动处理分页:

using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using System.Collections.Generic;
using System.Threading.Tasks;

public async Task<List<string>> GetAllPartitionKeysAsync(string tableName, string partitionKeyName)
{
    var partitionKeys = new List<string>();
    // 若需指定区域或本地DynamoDB,可传入AmazonDynamoDBConfig配置
    var client = new AmazonDynamoDBClient();
    string lastEvaluatedKey = null;

    do
    {
        var scanRequest = new ScanRequest
        {
            TableName = tableName,
            // 仅投影分区键,减少数据传输量
            ProjectionExpression = partitionKeyName,
            // 处理分页,传入上一页的最后一个分区键
            ExclusiveStartKey = lastEvaluatedKey != null ? new Dictionary<string, AttributeValue>
            {
                { partitionKeyName, new AttributeValue { S = lastEvaluatedKey } }
            } : null
        };

        var scanResponse = await client.ScanAsync(scanRequest);
        
        // 提取分区键值(此处假设分区键为字符串类型)
        foreach (var item in scanResponse.Items)
        {
            partitionKeys.Add(item[partitionKeyName].S);
            // 若分区键为数字类型,改用:
            // partitionKeys.Add(item[partitionKeyName].N);
            // 或转成对应数值类型:int.Parse(item[partitionKeyName].N)
        }

        // 更新分页标记
        lastEvaluatedKey = scanResponse.LastEvaluatedKey?.ContainsKey(partitionKeyName) == true 
            ? scanResponse.LastEvaluatedKey[partitionKeyName].S 
            : null;

    } while (lastEvaluatedKey != null);

    return partitionKeys;
}

方案2:使用高级别DocumentModel(简洁易用)

AWS提供的高级封装,代码更简洁,自动处理分页:

using Amazon.DynamoDBv2.DocumentModel;
using Amazon.DynamoDBv2;
using System.Collections.Generic;
using System.Threading.Tasks;

public async Task<List<string>> GetAllPartitionKeysWithDocumentModelAsync(string tableName, string partitionKeyName)
{
    var partitionKeys = new List<string>();
    var client = new AmazonDynamoDBClient();
    var table = Table.LoadTable(client, tableName);

    var scanConfig = new ScanOperationConfig
    {
        // 仅投影分区键
        ProjectionExpression = partitionKeyName
    };

    // 遍历所有分页结果
    var scanBatch = table.Scan(scanConfig);
    do
    {
        var documents = await scanBatch.GetNextSetAsync();
        foreach (var doc in documents)
        {
            // 字符串类型分区键
            partitionKeys.Add(doc[partitionKeyName].AsString());
            // 数字类型改用:
            // partitionKeys.Add(doc[partitionKeyName].AsInt().ToString());
        }
    } while (!scanBatch.IsDone);

    return partitionKeys;
}

注意事项

  • 确保执行代码的IAM角色/用户拥有DynamoDB的Scan权限
  • 投影表达式必须准确匹配表的分区键名称,大小写敏感
  • 若表数据量极大(百万级以上),可启用并行扫描:通过设置ScanRequest.TotalSegments和ScanRequest.Segment参数拆分扫描任务,提升速度
  • 因你的表分区键唯一,无需额外去重操作

内容的提问来源于stack exchange,提问作者James Buschow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:35:51