如何通过表达式查询Microsoft.Azure.Cosmos.Table下的Azure Table Storage
Azure Table Storage 表达式查询实现方案(Microsoft.Azure.Cosmos.Table v1.0.7.0)
你使用的v1.0.7.0版本SDK本身已内置LINQ表达式转OData过滤规则的能力,无需自己手动解析表达式,调整仓储层代码即可实现预期效果。
调整后仓储层代码
using Microsoft.Azure.Cosmos.Table; using Microsoft.Azure.Cosmos.Table.Linq; using System.Linq.Expressions; public async Task<IEnumerable<FiltersEntity>> Get(Expression<Func<FiltersEntity, bool>> query) { var table = _tableStorageConnector.CreateTableIfNotExists(_tableName); // 生成带表达式过滤的IQueryable对象 var queryable = table.CreateQuery<FiltersEntity>().Where(query); // 调用SDK内置异步执行方法,会自动将表达式转换为合法的OData过滤语句执行 return await queryable.ExecuteQueryAsync(); }
调用方式
和你预期的写法完全一致:
var data = await _filterRepository.Get(x => x.PartitionKey.Equals("examplepartitionkey"));
注意事项
- 必须引入
Microsoft.Azure.Cosmos.Table.Linq命名空间,否则无法识别ExecuteQueryAsync扩展方法 - 表达式写法需符合Azure Table Storage查询限制:仅支持简单的属性比较、逻辑运算符组合,不支持自定义方法、复杂嵌套运算,否则会抛出转换异常
- 如果需要手动获取生成的OData过滤字符串,直接调用
IQueryable的ToString()方法即可:var filterStr = table.CreateQuery<FiltersEntity>().Where(x => x.PartitionKey == "test").ToString(); // 输出结果为:PartitionKey eq 'test' - 如需基于生成的过滤字符串构造
TableQuery实现更复杂的查询控制,可以参考以下写法:var tableQuery = new TableQuery<FiltersEntity>().Where(filterStr); var result = await table.ExecuteQuerySegmentedAsync(tableQuery, null); return result.Results;
内容的提问来源于stack exchange,提问作者Sam Jones
相关产品推荐
相关产品推荐

