我想知道哪个用户在群组中发送了更多邮件。
public class UserEntity : TableEntity
{
public UserEntity()
{
}
public UserEntity(string chatId, string userId)
: base(chatId, userId)
{
}
public int Name { get; set; }
public int MessagesCount { get; set; }
}
当我收到新消息时,我会增加该用户的MessagesCount
。在一天结束时,我怎么知道哪一个具有最高MessagesCount
?
感谢。
答案 0 :(得分:4)
这是一种不需要您进行表扫描的替代方法。如果您创建了第二个表,其中分区键为反向消息计数(int.Max - MessageCount),行键为用户ID,则查询表没有任何分区或行键但使用Take(1)应该返回顶部的项目的表。由于azure表是按字典排序的,因此应该返回具有最低分区键的项目,该分区键是具有最高消息计数的实体。这种技术称为log-tail模式,当应用于行键时,它肯定适用于分区。我相信它应该适用于整个表中的分区键。
答案 1 :(得分:1)
您必须枚举所有实体,以找到具有最大MessagesCount
的实体。
有关如何设计表格以实现更多方案目标的详细信息,请参阅Azure Storage Table Design Guide。
更新
我不知道谁标记我的答案刚才没用,但Azure存储表服务确实不支持服务器端排序。换句话说,如果属性不是PartitionKey / RowKey,那么人们必须从表服务中查询所有实体并从客户端查找最小/最大值,这正是费韩的答案实际上所做的。老实说,这样的表格扫描总是意味着你的桌子设计不合适,这就是我建议人们阅读设计指南的原因。
答案 2 :(得分:1)
在一天结束时,我怎么知道哪一个具有最高的MessagesCount?
您可以按MessagesCount
排序,并获取具有最高MessagesCount的用户。并且您可以在计划的WebJob中执行以下查询并缓存结果,然后您可以从程序中的缓存中获取结果,而不是从表存储中查询结果。
TableQuery<UserEntity> query = new TableQuery<UserEntity>();
UserEntity user = table.ExecuteQuery(query).OrderBy(a => a.MessagesCount).LastOrDefault();
此外,您的要求类似于实施记分板,如果可能,您可以在每次更新用户时将 top-one 用户信息存储在单独的实体中MessagesCount,您可以将当前用户的MessagesCount与该实体进行比较,并在当前用户的MessagesCount更高时更新该实体。通过这种方式,您可以通过点查询查询该(一个)实体,以获得具有最高MessagesCount的用户。