![](/img/trans.png)
[英]Referencing services from CloudStorageAccount when migrating from WindowsAzure.Storage to Azure.Storage packages
[英]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 表似乎有很多混淆。
無論如何:我發現 Azure.Data.Tables 的API與WindowsAzure.Storage非常相似,我只需要在這里和那里進行一些調整。
但是我現在完全缺少的是QueryComparisons和TableQuery類。 他們剛剛走了嗎? 有替代品嗎?
要遷移的代碼示例如下:
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.Tables
的TableQuery
已經消失,並且文檔中對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.