我想要与我的 TableQuery 过滤器匹配的数千个实体中的前 100 个实体(最新(,我以两种方式尝试了它:
-
第一次尝试是在
foreach
循环中使用索引计数器,以便在达到"100"时中断。这给了我一个奇怪的随机数据子集,其中大部分丢失而不是 100 个实体;更像是几百个,而不是偶数。 -
第二次尝试粘贴在下面,基本上忽略了我的继续标记,并将
.take
设置为"100"。这为我提供了与取整数匹配的实体数,但缺少许多实体。
每次尝试都会给出不同的结果,我想我知道为什么,但我不知道如何修复它以获得我需要的东西。我意识到出于性能原因,在时间戳上设置查询过滤器不是很好(它没有索引......对吧?那么我应该用要过滤的日期/时间值填充另一个字段吗?
public async Task<List<ActivityModel>> GetActivitiesAsync(string DomainName, string NodeId, string ComputerName)
{
List<ActivityModel> activities = new List<ActivityModel>();
CloudTable cloudTable = TableConnection("NodeEvents");
string domainFilter = TableQuery.GenerateFilterCondition("DomainName", QueryComparisons.Equal, DomainName);
string nodeIdFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, NodeId);
string computerNameFilter = TableQuery.GenerateFilterCondition("ComputerName", QueryComparisons.Equal, ComputerName);
string filter1 = TableQuery.CombineFilters(domainFilter, TableOperators.And, nodeIdFilter);
string filter2 = TableQuery.CombineFilters(filter1, TableOperators.And, computerNameFilter);
TableContinuationToken continuationToken = null;
var result = await cloudTable.ExecuteQuerySegmentedAsync(new TableQuery<ActivityModel>().Where(filter2).Take(100), continuationToken);
if (result.Results != null)
{
foreach (ActivityModel entity in result.Results)
{
activities.Add(entity);
}
}
return activities;
}
您可以在文档中参考日志尾部模式。
使用按相反日期和时间顺序排序的RowKey值检索最近添加到分区的n个实体。
背景和问题
一个常见的要求是能够检索最近创建的实体,例如员工提交的十个最近费用报告。表查询支持从集合返回前 n 个实体的$top查询操作:没有等效的查询操作返回集中的最后n 个实体。
溶液
使用RowKey 存储实体,该RowKey使用 自然地按相反的日期/时间顺序排序,因此最新的条目始终是表中的第一个条目。
例如,为了能够检索员工最近提交的十个费用报告,您可以使用从当前日期/时间派生的反向刻度值。以下 C# 代码示例演示了一种为RowKey创建合适的"反向刻度"值的方法,该值从最新到最旧排序:
string invertedTicks = string.Format("{0:D19}", DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
您可以使用以下代码返回到日期时间值:
DateTime dt = new DateTime(DateTime.MaxValue.Ticks - Int64.Parse(invertedTicks));
表查询如下所示:
https://myaccount.table.core.windows.net/EmployeeExpense(PartitionKey='empid')?$top=10
问题和考虑因素
在决定如何实现此模式时,请考虑以下几点:
必须用前导零填充反向刻度值,以确保 字符串值按预期排序。
您必须了解分区级别的可伸缩性目标。注意不要创建热点分区。