Azure Table 存储 - 扩展 ITableEntity 的任何类型的通用下载

Azure Table Storage - Generic download for any type extending ITableEntity

我有四种自定义数据类型,每一种都扩展了 ITableEntity,它是 WindowsAzure.Storage 包的一部分。

现在,我有四种不同的方法从 Azure Table 存储下载数据。每个都遵循以下格式:

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

我已经用 TableEntityITableEntity 试过了,但我总是出错。对于 TableEntity,我的错误是我实际需要的类型不存在转换(当我调用 DownloadAnyEntity 方法时),而我认为它应该是隐式的,因为它是 [=13= 的扩展].

对于 ITableEntity,我得到一个错误,即 ExecuteQuery 输入必须是具有 public 无参数构造函数的非抽象类型。我所有的四个自定义类型都有 public 个无参数构造函数。

我觉得我看到的问题更多是因为没有完全理解继承,更多的是它是 Azure Table 存储特定的。非常感谢任何指针。

我基本上一直在关注 this documentation,但没有非类型特定实体下载方法的示例。

您可以使 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 继承并具有 public 空构造函数的任何类型调用此方法(ExecuteQuery 方法需要空构造函数才能创建实体)