web-dev-qa-db-ja.com

.NET CoreでのAzure Table Storage CreateQuery

.NET Framework 4.6.2をターゲットとする既存のクラスライブラリを.NET Core 1.1に移植しています。

.NET Frameworkバージョンで使用できるメソッドの一部は、.NET Coreにはないようです。そのような2つのメソッドはtable.CreateQueryおよびtable.ExecuteQuery

CreateQueryでエラーが発生する既存の関数を次に示します。

public T Get<T>(string partitionKey, string rowKey, string tableName) where T : ITableEntity, new()
            => getTable(tableName).CreateQuery<T>().Where(r => r.PartitionKey == partitionKey && r.RowKey == rowKey).FirstOrDefault();

.NET Coreでクエリを作成するにはどうすればよいですか?

18
Sam

この質問によると: dotnetコアの同期メソッドがありませんか?] NetCore/Netstandardサポートには、APIの同期実装がまだ含まれていません。

CreateQueryとExecuteQueryはすべてSyncメソッドであるため、.NET Coreでは使用できなかったため、ExecuteQuerySegmentedAsync、TableQuery、Fluent APIを使用して、返される継続トークンを処理することしかできませんでした。詳細については、次のコードを参照してください。


更新:

public static void Main(string[] args)
{
    var result = Get<BookTest3>("Aut_Fantasy", "Cert-0000000020", "DifferenetPartitionTest");
    Console.Write(result.PartitionKey);
    Console.Read();
}

public static T Get<T>(string partitionKey, string rowKey, string tableName) where T : ITableEntity, new()
{
    CloudTable table = ConnectToTable(tableName);
    TableQuery<T> employeeQuery = new TableQuery<T>().Where(
        TableQuery.CombineFilters(
            TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey),
            TableOperators.And,
            TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThan, rowKey))
        ).Take(1);
    var re = new T();
        TableContinuationToken continuationToken = null;
    do
    {
        Task<TableQuerySegment<T>> employees = table.ExecuteQuerySegmentedAsync(employeeQuery, continuationToken);
        TableQuerySegment<T> employeess = employees.Result;
        re= employeess.FirstOrDefault();
        continuationToken = employeess.ContinuationToken;
    } while (continuationToken != null);
    return re;
}

これがあなたにいくつかのヒントを与えることを願っています。


更新コード:

public static void Main(string[] args)
{
    var tas = Get<BookTest3>("Aut_Fantasy", "Cert-0000000020", "DifferenetPartitionTest");
    var result = tas.Result;
    Console.Write(result.PartitionKey);
    Console.Read();
}

public async static Task<T> Get<T>(string partitionKey, string rowKey, string tableName) where T : ITableEntity, new()
{
    //new T();
    CloudTable table = ConnectToTable(tableName);
    TableQuery<T> employeeQuery = new TableQuery<T>().Where(
        TableQuery.CombineFilters(
            TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey),
            TableOperators.And,
            TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThan, rowKey))
        ).Take(1);
    var re = new T();
        TableContinuationToken continuationToken = null;
    do
    {
        var employees = await table.ExecuteQuerySegmentedAsync(employeeQuery, continuationToken);

        re = employees.FirstOrDefault();
        continuationToken = employees.ContinuationToken;
    } while (continuationToken != null);
    return re;
}
17
Brando Zhang

これらの便利な拡張メソッドをこの投稿に追加します:)

public static async System.Threading.Tasks.Task<IEnumerable<DynamicTableEntity>> ExecuteQueryAsync(this CloudTable table, TableQuery query)
{
    TableContinuationToken token = null;
    var retVal = new List<DynamicTableEntity>();
    do
    {
        var results = await table.ExecuteQuerySegmentedAsync(query, token);
        retVal.AddRange(results.Results);
        token = results.ContinuationToken;
    } while (token != null);

    return retVal;
}

public static async System.Threading.Tasks.Task<IEnumerable<T>> ExecuteQueryAsync<T>(this CloudTable table, TableQuery<T> query) where T : ITableEntity, new()
{
    TableContinuationToken token = null;
    var retVal = new List<T>();
    do
    {
        var results = await table.ExecuteQuerySegmentedAsync(query, token);
        retVal.AddRange(results.Results);
        token = results.ContinuationToken;
    } while (token != null);

    return retVal;
}

これらは同じ機能を提供しますが、メソッド名としてExecuteQueryASYNCを使用します

10
bc3tech