本地Azure存储模拟器Table的LINQ查询及连接串配置问题
Azure Table Storage 开发问题解答
Q1:本地存储模拟器连接字符串
本地运行Azure存储模拟器(Azurite或旧版Azure Storage Emulator)时,连接串直接填写固定值即可:
var storageConnectionString = "UseDevelopmentStorage=true;";
注:填写前请确保本地存储模拟器已正常启动
Q2:LINQ查询实现方案
首先明确:Azure Table Storage为键值存储,服务端本身不支持按「行号」查询第N行数据,所有行默认按PartitionKey+RowKey排序,如需取第15行,需将查询结果拉取到本地后再按索引取值。
完整修改后的控制台代码
using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Azure.Cosmos.Table; using LokalTesting.TableEntities; namespace demo { class Program { // 改为异步入口方法 static async Task Main(string[] args) { Console.WriteLine("Table storage sample"); var storageConnectionString = "UseDevelopmentStorage=true;"; var tableName = "Test"; CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString); CloudTableClient tableClient = storageAccount.CreateCloudTableClient(new TableClientConfiguration()); CloudTable table = tableClient.GetTableReference(tableName); // 1. 查询所有NameId等于Jon的行(核心需求) // 因为你的Test实体PartitionKey和RowKey都等于NameId,直接查PartitionKey性能最优 var jonQuery = table.CreateQuery<Test>() .Where(t => t.PartitionKey == "Jon"); var jonResults = await ExecuteQueryAllAsync(table, jonQuery); // 2. 查询表内全部内容 var allQuery = table.CreateQuery<Test>(); var allResults = await ExecuteQueryAllAsync(table, allQuery); // 3. 取查询结果中第15行(索引从0开始,所以跳过前14条,结果不足15条时返回null) var row15 = allResults.Skip(14).FirstOrDefault(); // 打印Jon的查询结果 Console.WriteLine("===== NameId为Jon的查询结果 ====="); foreach (var item in jonResults) { Console.WriteLine($"NameId: {item.NameId}"); Console.WriteLine($"Status: {item.Status}"); Console.WriteLine($"RoutingId: {item.RoutingId}"); Console.WriteLine("------------------------"); } // 可选:打印第15行数据 if (row15 != null) { Console.WriteLine("===== 第15行数据 ====="); Console.WriteLine($"NameId: {row15.NameId}, Status: {row15.Status}, RoutingId: {row15.RoutingId}"); } Console.ReadKey(); } // 通用全量查询方法,解决Table Storage分段查询的问题 private static async Task<List<T>> ExecuteQueryAllAsync<T>(CloudTable table, IQueryable<T> query) where T : TableEntity, new() { var results = new List<T>(); TableQuerySegment<T> segment = null; do { segment = await query.AsTableQuery().ExecuteSegmentedAsync(segment?.ContinuationToken); results.AddRange(segment.Results); } while (segment.ContinuationToken != null); return results; } } }
补充说明
- 如果你的数据量很小,也可以直接用同步方法
var jonResults = table.CreateQuery<Test>().Where(t => t.NameId == "Jon").ToList(),无需额外写异步查询方法 - 尽量优先用
PartitionKey和RowKey作为查询条件,避免全表扫描,性能更高
内容的提问来源于stack exchange,提问作者Glenn Helgesen
相关产品推荐
相关产品推荐

