18

次のように、partitionKey によってテーブルからすべてのエンティティを取得することを抽象化しようとしています。

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;
        }
    }

しかし、それは失敗しています

new TableQuery<T>

TElement にはパラメーターなしのコンストラクターがないためです。

4

3 に答える 3

28

質問でも述べたように、 T にはパラメーターなしのコンストラクターが必要です。したがって、メソッドの定義を次のように変更してください。

public List<T> GetEntities<T>(string partitionKey, T entity) where T : TableEntity, new ()
于 2012-11-20T19:26:58.340 に答える
8

テーブルストレージ用の小さな汎用リポジトリを作成しました:

 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
}
于 2016-09-05T17:57:05.547 に答える