Azure Table Storage - универсальная загрузка для любого типа, расширяющая ITableEntity

2

У меня есть четыре пользовательских типа данных, каждый из которых расширяет ITableEntity, который является частью пакета WindowsAzure.Storage.

Прямо сейчас у меня есть четыре разных метода для загрузки данных из хранилища таблиц Azure. Каждый из них следует этому формату:

public List<MyCustomEntity> DownloadMyCustomEntities(string tableId)
{
    // Reference the CloudTable object
    CloudTable table = tableClient.GetTableReference(tableId);

    TableQuery<MyCustomEntity> query = new TableQuery<MyCustomEntity>();
    return new List<MyCustomEntity>(table.ExecuteQuery(query));
}

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

Вот что я пробовал:

public List<TableEntity> DownloadAnyEntity(string tableId)
{
    // Reference the CloudTable object
    CloudTable table = tableClient.GetTableReference(tableId);

    TableQuery<TableEntity> query = new TableQuery<TableEntity>();
    return new List<TableEntity>(table.ExecuteQuery(query));
}

Я пробовал это с помощью TableEntity и ITableEntity, но я продолжаю получать ошибки. Для TableEntity моя ошибка заключается в том, что никакой тип не существует для типа, который мне действительно нужен (когда я вызываю метод DownloadAnyEntity), тогда как я считаю, что он должен быть неявным, поскольку это расширение ITableEntity.

Для ITableEntity я получаю сообщение об ошибке, что вход ExecuteQuery должен быть не абстрактным типом с открытым конструктором без параметров. Все мои четыре пользовательских типа имеют общедоступные конструкторы без параметров.

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

В основном я слежу за этой документацией, но нет примера для метода загрузки объектов, не относящегося к типу.

  • 0
    Вместо TableEntity , можете ли вы попробовать использовать DynamicTableEntity ( docs.microsoft.com/en-us/dotnet/api/… )?
  • 0
    Спасибо - когда я пытаюсь это сделать, у меня возникает проблема, которую я не могу привести из типа DynamicTableEntity к любому из моих пользовательских типов.
Теги:
azure
azure-storage
azure-table-storage

1 ответ

2
Лучший ответ

Вы можете сделать метод DownloadAnyEntity общим с ограничениями на параметр типа

public List<T> DownloadAnyEntity<T>(string tableId) where T: ITableEntity, new()
{
    // Reference the CloudTable object
    var tableRef = tableClient.GetTableReference(tableId);

    var query = new TableQuery<T>();
    return tableRef.ExecuteQuery(query).ToList();
}

Затем этот метод можно вызвать для любого типа, который наследуется от ITableEntity и имеет открытый конструктор emtpy (метод ExecuteQuery требует пустого конструктора для создания объектов)

  • 0
    Спасибо за быстрый ответ. Когда я пытаюсь это tableRef.ExecuteQuery фрагмент tableRef.ExecuteQuery выдает мне сообщение об ошибке: «T» должен быть неабстрактного типа с открытым конструктором без параметров, чтобы использовать его в качестве параметра «TElement» в универсальном типе или методе «CloudTable». ExecuteQuery <TElement> (TableQuery <TElement>, TableRequestOptions, OperationContect) '
  • 1
    @Azarantara добавил обновление. Классы, которые используют эти методы, должны иметь пустой открытый конструктор, иначе метод ExecuteQuery не может создавать экземпляры
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню