TableBatchOperation batchOperation = new TableBatchOperation(); for (int i = 0; i < 10; i++) { DateTime now = DateTime.Now; string partitionKey = now.ToString("yyyyMM"); string rowKey = now.ToString("ddHHmmssffff"); MyLogEntity logEntity = new MyLogEntity(partitionKey, rowKey); logEntity.LogDate = now; logEntity.LogMessage = "test message" + i.ToString(); logEntity.ErrorType = (i%2) == 0 ? "error" : "warning"; batchOperation.Insert(logEntity); Thread.Sleep(10); } logTable.ExecuteBatch(batchOperation);
这次我们把 TableOperation 类换成了 TableBatchOperation 类,然后一次插入十条数据。去检查一下结果,OK 十条数据全部插入成功!
下面让我们把循环中的 10 改成 200 试试:
怎么收到一个 InvalidOperationException 呢?看看红框中的内容,原来批量操作是有一些限制的:
1. 每个批量操作的数据上限是 100 条记录。
2. 每个批量操作中的数据都必须保持相同的 partition key。
请大家在使用批量操作时务必注意这些限制条件!
对于日志数据的操作,最重要的就是查询。我们通过几个具体的用例来介绍 Table storage 的查询操作。
查询所有的记录这是最简单的查询方法,一般是想要导出全部数据时才会这么干:
TableQuery<MyLogEntity> query = new TableQuery<MyLogEntity>(); foreach (MyLogEntity entity in logTable.ExecuteQuery(query)) { Console.WriteLine("{0}\t{1}\t{2}\t{3}", entity.PartitionKey, entity.RowKey, entity.LogMessage, entity.ErrorType); }
查询某年的某个月的记录要查询某个月的所有记录也是比较容易的,因为我们设计的 PartitionKey 就代表了某个月份:
TableQuery<MyLogEntity> query = new TableQuery<MyLogEntity>().Where( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "201607")); foreach (MyLogEntity entity in logTable.ExecuteQuery(query)) { //... }
请注意 TableQuery.GenerateFilterCondition 方法,我们创建了一个过滤条件:PartitionKey 等于 "201607"。这个查询会把所有 PartitionKey 为 "201607" 的记录都找到!
查询某一条记录如果我们已经知道了一条记录的 PartitionKey 和 RowKey,就可以通过这两个条件直接查询到这条记录的详情:
TableQuery<MyLogEntity> query = new TableQuery<MyLogEntity>().Where( TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "201607"), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, "161148372454"))); foreach (MyLogEntity entity in logTable.ExecuteQuery(query)) { //... }
这次我们使用了组合条件。虽然这里只使用了条件运算操作 TableOperators.And 和 QueryComparisons.Equal,你完全可以尝试其它的条件类型。唯一要注意的是:对于 PartitionKey 和 RowKey,QueryComparisons 的操作对象都是字符串。