Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Azure Table Storage CreateQuery in .NET Core

I'm porting my existing class library that targets .NET Framework 4.6.2 to .NET Core 1.1.

Looks like some of the methods that are available in .NET Framework version are not there in .NET Core. Two such methods are table.CreateQuery and table.ExecuteQuery.

Here's an existing function that's giving me an error for 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();

How do I create query in .NET Core?

like image 548
Sam Avatar asked Mar 21 '17 20:03

Sam


People also ask

Is Azure table storage being deprecated?

Azure Table Storage is being (or has already been) phased out completely in favor of Cosmos DB.

What type of storage is Azure table storage?

Azure Table storage is a service that stores non-relational structured data (also known as structured NoSQL data) in the cloud, providing a key/attribute store with a schemaless design. Because Table storage is schemaless, it's easy to adapt your data as the needs of your application evolve.


1 Answers

According to this question: Missing syncronous methods for dotnet core?,NetCore/Netstandard support does not yet include Sync implementation of the APIs.

Since CreateQuery and ExecuteQuery are all Sync method, so we couldn’t use it in .NET Core, you could only use ExecuteQuerySegmentedAsync,TableQuery, Fluent API and handle the continuation token it returns. More details, you could refer to follow codes:


Update:

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

Hope this could give you some tips.


Update code:

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;
}
like image 178
Brando Zhang Avatar answered Sep 19 '22 11:09

Brando Zhang