首页 > 解决方案 > 使用表达式查询 Azure 表存储

问题描述

我希望通过将表达式而不是 TableQuery 传递到我的存储库来查询表存储,我的目标是:

public async Task<IEnumerable<FiltersEntity>> Get(Expression<Func<FiltersEntity, bool>> query)
{  
    var table = _tableStorageConnector.CreateTableIfNotExists(_tableName);


    return await table.CreateQuery<FiltersEntity>().Where(query).ToList();
}

理想用法:

    var data = await _filterRepository.Get(x => x.PartitionKey.Equals("examplepartitionkey"));

我看不到任何方法CreateQueryCreateQuery接受表达式,只有文本。

我还查看了是否可以将表达式转换为过滤文本,例如PartitionKey eq examplepartitionkey,但没有运气。

有人可以帮我通过表达式查询天蓝色表存储吗?

我使用的 SDK 是 Microsoft.Azure.Cosmos.Table v1.0.7.0;

标签: c#azureazure-table-storage

解决方案


假设针对 Azure 表存储使用 Cosmos 表驱动程序,您应该能够执行以下操作

public async Task<IEnumerable<MyTable>> MyQuery(Expression<Func<MyTable, bool>> predicate)
{
    var tableClient = new CloudTableClient(
        new Uri("..."),
        new StorageCredentials(".."));

    var table = tableClient.GetTableReference("MyTable");

    var tableQuery = table.CreateQuery<MyTable>()
        .Where(predicate)
        .AsTableQuery(); // << convert back from IQueryable to TableQuery

    var onePage = await table.ExecuteQuerySegmentedAsync(tableQuery, null);
    return onePage.Results;
}

WhereMyTable实现ITableEntity和扩展自定义列。

请注意,如果查询可能返回超过一页的数据,那么您需要将 null 替换为TableContinuationToken并循环收集页面。

我同意 Azure 表存储的客户端库的数量和指导正在变得非常令人沮丧。


推荐阅读