簡體   English   中英

從“WindowsAzure.Storage”遷移時,我應該為 Azure 表使用什么 package

[英]What package should I use for Azure Tables when migrating away from "WindowsAzure.Storage"

我目前正在將使用 ASP.NET WebApi 為 .NET Fx 4.8 編寫的項目遷移到 .NET 5.0。 該項目大量使用 package WindowsAzure.Storage來訪問 Azure 存儲帳戶上的 BLOB、表和隊列。 這個 package 現在已經被棄用了一段時間,說明它已經被分成幾個包。

對於隊列和 Blob,我應該遷移到什么位置非常清楚。 但是,關於 Azure 表似乎有很多混淆。

  • First of all in the NuGet package WindowsAzure.Storage it states that the package to use for tables would be Microsoft.Azure.CosmosDB.Table . 這有點令人困惑,因為我一直認為“CosmosDB”與“Azure Tables”完全不同,但也許我錯了。
  • 但是, Microsoft.Azure.CosmosDB.Table的描述指出此 package 處於維護模式,將被棄用。 我應該改用Microsoft.Azure.Cosmos.Table
  • Microsoft.Azure.Cosmos.Table但是很久沒有更新了,而且 2.0.0 的預覽版已經兩年多了。 GitHub repo 上還有一個問題,專門詢問該項目是否已死 - 沒有答案。
  • 搜索后,我發現 package Azure.Data.Tables最接近我可能正在尋找的東西。 它已更新,看起來很活躍,並且似乎與其他存儲包一致(版本號)。 只是命名有點偏離。 今年 6 月,MS 還發表了一篇博文,談到這款 package 是全新的,所以我想這就是我要找的東西?

無論如何:我發現 Azure.Data.Tables 的APIWindowsAzure.Storage非常相似,我只需要在這里和那里進行一些調整。

但是我現在完全缺少的是QueryComparisonsTableQuery類。 他們剛剛走了嗎? 有替代品嗎?

要遷移的代碼示例如下:

var part1 = 
  TableQuery.GenerateFilterConditionForGuid(
    nameof(SomeEntity.Id),
    QueryComparisons.Equal,
    idValue));
var part2 = 
  TableQuery.GenerateFilterConditionForGuid(
    nameof(SomeEntity.Category)
    QueryComparisons.Equal,
    category));
return TableQuery.CombineFilters(part1, TableOperators.And, part2);

我遇到了同樣的問題。 是的,來自Microsoft.Azure.Cosmos.TablesTableQuery已經消失,並且文檔中對TableOdataFilter的引用是無用的,因為它不存在。

看着這個,我發現使用Azure.Data.Tables package 方法查詢 Azure 存儲表的最簡單方法是使用.Query<T>([predicate])方法 例如

TableClient customers;

var example = customers.Query<Customer>(c => c.Name == "Microsoft");

還有一個.QueryAsync<T>(..)異步版本。

如果您使用TableQuery構建查詢,則沒有直接的替代方法,但您可以使用PredicateBuilder之類的東西來組合.And().Or()表達式來創建謂詞。

我修改了這個以創建一個流暢的版本:

    /// <summary>
    /// Helper class to build predicates fluently
    /// </summary>
    /// <remarks>
    /// Adapted from source: http://www.albahari.com/nutshell/predicatebuilder.aspx
    /// </remarks>
    public class PredicateBuilder<T>
    {
        private Expression<Func<T, bool>> expression;

        /// <summary>
        /// Add an OR clause
        /// </summary>
        /// <param name="expr">new expression</param>
        /// <returns></returns>
        public PredicateBuilder<T> Or(Expression<Func<T, bool>> expr)
        {
            if (expression == null)
                expression = expr;
            else
            {
                var invokedExpr = Expression.Invoke(expr, expression.Parameters.Cast<Expression>());
                expression = Expression.Lambda<Func<T, bool>>(Expression.OrElse(expression.Body, invokedExpr), expression.Parameters);
            }
            return this;
        }

        /// <summary>
        /// Add an AND clause
        /// </summary>
        /// <param name="expr">new expression</param>
        /// <returns></returns>
        public PredicateBuilder<T> And(Expression<Func<T, bool>> expr)
        {
            if (expression is null)
                expression = expr;
            else
            {
                var invokedExpr = Expression.Invoke(expr, expression.Parameters.Cast<Expression>());
                expression = Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expression.Body, invokedExpr), expression.Parameters);
            }
            return this;
        }

        /// <summary>
        /// Return resulting expression
        /// </summary>
        /// <returns></returns>
        public Expression<Func<T, bool>> ToPredicate()
        {
            if (expression is null)
                return (T value) => true;
            return expression;
        }
    }

示例用法:

var query = new PredicateBuilder<Customer>();

if(name != null)
  query.And(c => c.Name == name);

if (isActive == false)
  query.And(c => c.IsActive == false);

希望這可以幫助

您可能應該在該博客文章相關文檔中進一步閱讀:

查詢表實體

TableClient 允許用戶使用 OData 過濾器創建自定義查詢。

string MyPK = "markers";
string MyRK = "id-001";
string filter = TableOdataFilter.Create($"PartitionKey eq {MyPK} or RowKey eq {MyRK}")

Pageable<TableEntity> entities = tableClient.Query<TableEntity>(filter: filter);

foreach (TableEntity entity in entities)
{
    Console.WriteLine($"{entity.GetString("Product")}: {entity.GetInteger("Count")}");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM