使用.NET反射查询Azure表存储

本文关键字:存储 Azure 查询 NET 反射 使用 | 更新日期: 2023-09-27 18:26:55

我想编写一个函数GetAny(),只需使用LINQ提供表名tableName和实体类型T,就可以查询并返回Azure表存储中任何表中的行。到目前为止,我尝试的内容如下:

public T GetAny<T>(TableServiceContext tableStorageServiceContext, 
    string tableName, string partitionKey, string applicationName)
{
    var results = from c in tableStorageServiceContext.CreateQuery<T>(tableName)
        where ((T)c).PartitionKey == partitionKey
        select c;
    var query = results.AsTableServiceQuery();
    return query.Execute().FirstOrDefault();
}

,它不编译,因为我不允许像我尝试的那样将c强制转换为T

我也尝试默认为TableServiceEntity,但在调用GetAny()之后,我仍然必须将生成的TableServiceEntity强制转换为true实体类型:

TableServiceEntity GetAny(string tableName, string partitionKey)
{
    var results = from c in _tableStorageServiceContext.CreateQuery<TableServiceEntity>(tableName)
                  where c.PartitionKey == partitionKey 
                  select c;
    var query = results.AsTableServiceQuery();
    return query.Execute().FirstOrDefault();
}

有没有一种方法可以通过.NET反射实现这一点,或者可能有其他方法可以查询Azure表存储,支持不必隐式指定实体类型?

使用.NET反射查询Azure表存储

您可以使用以下代码从任何存储表进行查询:

/// <summary>
/// Returns table entities
/// </summary>
public List<dynamic> GetEntities(string tableName, int takeCount, string filters)
    {
        var table = TableClient.GetTableReference(tableName);
        var tableQuery = !filters.IsEmpty()
                             ? new TableQuery<DynamicTableEntity>().Where(filters).Take(takeCount)
                             : new TableQuery<DynamicTableEntity>().Take(takeCount);
        var tableResult = table.ExecuteQuery(tableQuery);
        List<dynamic> dynamicCollection = tableResult.ToDynamicList();
        return dynamicCollection;
    }

扩展方法ToDynamicList基本上读取结果上的每个实体,并将属性值映射为dynamic类型。Storage Library默认情况下会将值隐藏在一组属性后面,如.BinaryValue、"BoolValue"

我写了一个通用的存储表浏览器,你可以在github 上找到它