[Azure] C# + Microsoft.Azure.Cosmos.Table v1+ Azure Storage Table - 多重條件查詢 資料

2021-01-11

之前幾篇文章,我們送了不少資料進去,今天我們來說一下如何查詢資料回來,當然因為 Azure Table  中,因為他價格不貴,但是限制還是有的,不然 CosmosDB 就不用賣了。



今天案例我只有針對數字搜,當然這概念有了其他搜尋都是一樣的堆加上去而已,我有一萬筆資料分別 Age 是從1 到 10000,裡面有一萬筆資料 我去搜尋當 Age >100 && Age <=200 的 資料回來,這裡面我只要求撈回 Age 欄位,當然其他的 PK, RK , ETag 基本的屬性都會跟著回來.

var tableClient = CloudStorageAccount.Parse(_ConnectionString).CreateCloudTableClient(new TableClientConfiguration());
var table = tableClient.GetTableReference("table1");
string pkFilter = new TableQuery<User>()
.Where(TableQuery.GenerateFilterCondition("PartitionKey",
QueryComparisons.Equal, "CLASSA")).FilterString;
string ageGreaterFilter = new TableQuery<User>()
.Where(TableQuery.GenerateFilterConditionForInt("Age",
QueryComparisons.GreaterThan, 100)).FilterString;
string ageLessequalFilter = new TableQuery<User>()
.Where(TableQuery.GenerateFilterConditionForInt("Age",
QueryComparisons.LessThanOrEqual, 200)).FilterString;
string combineAgeFilter = TableQuery.CombineFilters(ageGreaterFilter, TableOperators.And, ageLessequalFilter);
string combinePKAndAgeFilter = TableQuery.CombineFilters(pkFilter, TableOperators.And, combineAgeFilter);
TableQuery<User> query = new TableQuery<User>().Where(combinePKAndAgeFilter);
//只選擇固定欄位回來
query.SelectColumns = new List<string>();
query.SelectColumns.Add("Age");
var entities = table.ExecuteQuery<User>(query);
Console.WriteLine("Search Age <=200 And > 100 Count :" + entities.Count());
foreach (var data in entities)
{
Console.Write(data.RowKey + ":" + data.Age + " ; ");
}


說難不難因為一開始我以為可以直接的下 .Where 直接使用 LINQ 但是測試結果是不行的,還是要透過拼湊的方式來做的,然後這裏面還有一些不支持的 LINQ   操作,像是 OrderBy ..詳細請看我下面附的連結。筆記一下,給之後需要的人..

reference:
https://docs.microsoft.com/en-us/rest/api/storageservices/Query-Operators-Supported-for-the-Table-Service?redirectedfrom=MSDN


當麻許的超技八 2014 | Donma Hsu Design.