Общий запрос для объектов хранилища таблиц Azure - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь создать общий доступ к своему хранилищу таблиц Azure с помощью операций Crud, но сталкиваюсь с проблемой, когда мне кажется, что мой сервис должен зависеть от имен свойств для запроса отдельных записей.

My Generic Service

public class AzureTableStorageService<T> where T : CustomTableEntity, new()
{
    private readonly CloudStorageAccount _storageAccount;
    private readonly CloudTableClient _tableClient;

    public AzureTableStorageService()
    {
        _storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
        _tableClient = _storageAccount.CreateCloudTableClient();
    }

    // How do I make this generic if I know all objects 
    // calling this have a single primary key Id field?
    public GameEntity GetGameEntityById(string tableName, int id)
    {
        var table = GetStorageTable(tableName);

        // I want to swap GameEntity for T here but then I lose 
        // the understanding that it has an Id field to Query by
        IEnumerable<GameEntity> query = (from game in table.CreateQuery<GameEntity>()
                                         where game.Id == id
                                         select game);

        return query.FirstOrDefault();
    }

    // I am successfully inserting generically here
    public void InsertRequestToStorage(Guid operationId, ITableEntity entity, string tableName)
    {
        TableOperation insertOperation = TableOperation.Insert(entity);
        CloudTable table = GetStorageTable(tableName);

        table.Execute(insertOperation);
    }

    // I am successfully getting all entities on a table generically here 
    public List<T> GetTableEntities(string tableName)
    {
        CloudTable table = GetStorageTable(tableName);

        TableContinuationToken token = null;
        var entities = new List<T>();
        do
        {
            var queryResult = table.ExecuteQuerySegmented(new TableQuery<T>(), token);
            entities.AddRange(queryResult.Results);
            token = queryResult.ContinuationToken;
        } while (token != null);

        return entities;
    }
}

Можно ли получить динамический доступ к одной записи из этой таблицы, если я знаю, что все таблицы, к которым осуществляется такой доступ, должны иметь один первичный ключ с идентификатором

...