.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でクエリを作成するにはどうすればよいですか?
この質問によると: 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;
}
これらの便利な拡張メソッドをこの投稿に追加します:)
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を使用します