使用.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表存储,支持不必隐式指定实体类型?
您可以使用以下代码从任何存储表进行查询:
/// <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 上找到它