Я пытаюсь создать общий доступ к своему хранилищу таблиц 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;
}
}
Можно ли получить динамический доступ к одной записи из этой таблицы, если я знаю, что все таблицы, к которым осуществляется такой доступ, должны иметь один первичный ключ с идентификатором