【问题标题】:Azure Table Storage CreateQuery in .NET Core.NET Core 中的 Azure 表存储 CreateQuery
【发布时间】:2017-08-13 17:42:27
【问题描述】:

我正在将面向 .NET Framework 4.6.2 的现有类库移植到 .NET Core 1.1。

看起来 .NET Framework 版本中可用的某些方法在 .NET Core 中不存在。两个这样的方法是table.CreateQuerytable.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 中创建查询?

【问题讨论】:

  • 在我的例子中是在谓词中使用方法而不是标准运算符(==、!= 等)。

标签: c# azure-table-storage azure-sdk-.net


【解决方案1】:

根据这个问题:Missing syncronous methods for dotnet core?,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;
}

【讨论】:

  • 如何使我的方法通用,以便我可以读取任何实体,即 Get,而不仅仅是 BookTest3?我一直在到处寻找一些例子,但我找不到。我的代码中的 GET 方法必须在任何情况下都可用——这意味着它应该能够返回任何对象类型。
  • 谢谢。对此,我真的非常感激。我不认为 Get 方法中的第一行 new T(); 是必需的,是吗?
  • 如果可以的话,我还有一个问题。即使我们使用ExecuteQuerySegmentedAsync() 进行异步调用,我们也不会在方法内使用await 或在方法头中使用async Task&lt;T&gt;。我调用Get&lt;T&gt; 方法的业务层方法通常是async 方法,所以即使我们在其中进行异步调用,也不使用await 调用Get&lt;T&gt; 感觉有点尴尬。
  • 据我所知,我们也可以在方法头中使用async Task,在方法内容中使用await,和我的代码一样,只是改了一点代码.
  • 如何使用 linq 进行查询?
【解决方案2】:

我会在这篇文章中添加这些方便的扩展方法:)

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 作为方法名称

【讨论】:

  • 请举例说明如何使用它们
猜你喜欢
  • 1970-01-01
  • 2019-04-23
  • 2021-07-22
  • 1970-01-01
  • 2017-08-23
  • 2018-05-26
  • 2017-05-16
  • 2020-12-18
  • 2023-02-18
相关资源
最近更新 更多