2013-05-16 73 views
1

好的,所以我第一次在ASP.NET MVC 3應用程序中使用Azure表存儲。Azure表存儲:如何創建動態where子句?

我有一個表格實體,其用戶標識爲RowKey。我有一個用戶ID列表,需要獲取具有其中一個用戶ID的所有實體。

在傳統的SQL這將是在where子句中的簡單或聲明,你可以動態地添加到:

select * from blah 
where userID = '123' or userID = '456' or userID = '789' 

,但我還沒有發現在Azure的SDK的等價物。

Azure表存儲可以這麼做嗎?

謝謝, 大衛

回答

1

Alrighty,多一點挖我找到了答案。

您可以構建一個地方使用語法過濾這裏找到:http://msdn.microsoft.com/en-us/library/windowsazure/ff683669.aspx

所以對於我的小例子它結束了看起來像這樣:

我有一個逗號分隔發送到這個方法

ID的字符串
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["TableStorageConnectionString"]); 

CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); 
CloudTable table = tableClient.GetTableReference("Blah"); 

string[] split = IDs.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 

string filter = null; 
for (int i = 0; i < split.Length; i++) 
{ 
    filter += " RowKey eq '" + split[i] + "' "; 
    if (i < split.Length - 1) 
     filter += " or "; 
} 

TableQuery<Blah> rangeQuery = new TableQuery<Blah>().Where(filter); 
var result = table.ExecuteQuery(rangeQuery); 

結果列出了我需要的東西。

有一點要記住的是,你不想在一個非常大的表上使用它,因爲我只是得到了導致表掃描的RowKey。如果一起使用PartitionKey和RowKey,則效率更高。我的表格非常小​​(最多有幾百條記錄),所以它不應該成爲問題。

希望這可以幫助別人。

大衛

0
  • .NET客戶端爲天青表存儲具有的功能,生成和組合過濾。

所以,你可以寫你的過濾器表達式像

string[] split = IDs.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 
string mainFilter = null; 
foreach (var id in split) 
{ 
    var filter = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, id); 
    mainFilter = mainFilter != null ? TableQuery.CombineFilters(mainFilter, TableOperators.And, filter) : filter; 
} 

var rangeQuery = new TableQuery<Blah>().Where(mainFilter); 
var result = table.ExecuteQuery(rangeQuery); 

不幸Contains方法不是supported by the Table Service但你可以寫一個簡單的方法來動態建立LINQ查詢:

public static class ContainsExtension 
{ 
    public static Expression<Func<TEntity, bool>> Contains<TEntity, 
     TProperty>(this IEnumerable<object> values, 
     Expression<Func<TEntity, TProperty>> expression) 
    { 
     // Get the property name 
     var propertyName = ((PropertyInfo)((MemberExpression)expression.Body).Member).Name; 

     // Create the parameter expression 
     var parameterExpression = Expression.Parameter(typeof (TEntity), "e"); 

     // Init the body 
     Expression mainBody = Expression.Constant(false); 

     foreach (var value in values) 
     { 
      // Create the equality expression 
      var equalityExpression = Expression.Equal(
       Expression.PropertyOrField(parameterExpression, propertyName), 
       Expression.Constant(value)); 

      // Add to the main body 
      mainBody = Expression.OrElse(mainBody, equalityExpression); 
     } 

     return Expression.Lambda<Func<TEntity, bool>>(mainBody, parameterExpression); 
    } 
} 

所以,你可以輕鬆地構建動態查詢:

var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["TableStorageConnectionString"]); 

var tableClient = storageAccount.CreateCloudTableClient(); 
var table = tableClient.GetTableReference("Blah"); 
var split = IDs.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 

// Create a query: in this example I use the DynamicTableEntity class 
var query = table.CreateQuery<DynamicTableEntity>() 
     .Where(split.Contains((DynamicTableEntity d) => d.RowKey)); 

// Execute the query 
var result = query.ToList();