Joe*_*ter 14 c# azure azure-storage azure-table-storage
我试图通过partitionKey抽象来自Table的所有实体,如下所示:
public List<T> GetEntities<T>(string partitionKey, T entity) where T : TableEntity
{
try
{
var tableClient = _account.CreateCloudTableClient();
var table = tableClient.GetTableReference(entity.GetType().Name.ToLower());
var exQuery =
new TableQuery<T>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal,
partitionKey));
var results = table.ExecuteQuery(exQuery).Select(ent => (T) ent).ToList();
return results;
}
catch (StorageException ex)
{
//TODO: Add more trace info
Trace.TraceInformation("Unable to retrieve entity based on query specs");
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,它失败了
new TableQuery<T>
Run Code Online (Sandbox Code Playgroud)
因为TElement没有无参数构造函数.
Ser*_*ler 22
正如您在问题中提到的,T必须具有无参数构造函数.因此,请更改您的方法的定义如下:
public List<T> GetEntities<T>(string partitionKey, T entity) where T : TableEntity, new ()
Run Code Online (Sandbox Code Playgroud)
我为表存储编写了一个小的通用存储库:
public class CloudTableRepository<T> where T : ITableEntity,new ()
{
private readonly string _tableName;
private CloudTable _table;
public CloudTableRepository(string tableName)
{
_tableName = tableName;
InitializeTable();
}
#region Public Methods
public virtual async Task<List<T>> GetPartitionAsync(string partitionKey, int takeCount = 1000)
{
var result = new List<T>();
var query =
new TableQuery<T>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal,
partitionKey));
query.TakeCount = takeCount;
TableContinuationToken tableContinuationToken = null;
do
{
var queryResponse = await _table.ExecuteQuerySegmentedAsync(query, tableContinuationToken);
tableContinuationToken = queryResponse.ContinuationToken;
result.AddRange(queryResponse.Results);
} while (tableContinuationToken != null);
return result;
}
public virtual async Task<TableResult> GetSingleAsync(string partitionKey, string rowKey)
{
return await GetSingle(partitionKey, rowKey);
}
public virtual async Task<T> UpdateAsync(T tableEntityData)
{
var updateCallistConfig = await GetSingleAsync(tableEntityData.PartitionKey, tableEntityData.RowKey);
if (updateCallistConfig != null)
{
var updateOperation = TableOperation.InsertOrMerge(tableEntityData);
var tableResult = await _table.ExecuteAsync(updateOperation);
return (T) tableResult.Result;
}
return default(T);
}
public virtual async Task<T> AddAsync(T tableEntityData)
{
var retrieveOperation = TableOperation.Insert(tableEntityData);
var tableResult = await _table.ExecuteAsync(retrieveOperation);
return (T) tableResult.Result;
}
#endregion
#region Private Methods
private async void InitializeTable()
{
var storageAccount =
CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("TableStorageConnectionString"));
var tableClient = storageAccount.CreateCloudTableClient();
_table = tableClient.GetTableReference(_tableName);
await _table.CreateIfNotExistsAsync();
}
private async Task<TableResult> GetSingle(string partitionKey, string rowKey)
{
var retrieveOperation = TableOperation.Retrieve<T>(partitionKey, rowKey);
var tableResult = await _table.ExecuteAsync(retrieveOperation);
return tableResult; //(T) tableResult.Result;
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14170 次 |
最近记录: |