我是Azure的新手!目的是根据存储在RowKey中的时间戳返回行。由于每个查询都有一个事务成本,所以我希望在保持性能的同时最小化事务/查询的数量
这些是建议的分区键和行键:
- 分区键: TextCache_(AccountID)_(ParentMessageId)
- 行键: (DateOfMessage)_(MessageId)
:
- AccountId -是一个整数
- ParentMessageId -如果有父messageId,则为父messageId,如果为父 则为空
- DateOfMessage -消息创建的日期-格式为DateTime.Ticks.ToString("d19")
- MessageId—消息的唯一Id
我想从单个查询中返回行和任何>或
这可以通过我提出的PartitionKeys和RowKeys来完成吗?
ie . .(psuedo代码)
var results = ctx.PartitionKey.StartsWith(TextCache_AccountId)
&& ctx.RowKey > (TimeStamp)_MessageId
其次,如果我有许多帐户,并且只想返回前10个帐户,可以通过单个查询
来完成吗?ie . .(psuedo代码)
var results = (
(
ctx.PartitionKey.StartsWith(TextCache_(AccountId1)) &&
&& ctx.RowKey > (TimeStamp1)_MessageId1 )
)
||
(
ctx.PartitionKey.StartsWith(TextCache_(AccountId2)) &&
&& ctx.RowKey > (TimeStamp2)_MessageId2 )
) ...
)
.Take(10)
对你的问题的简短回答是肯定的,但是有些事情你需要注意。
Azure表存储没有.StartsWith()
的直接等价物。如果您将存储库与LINQ结合使用,则可以使用.CompareTo()
(>和<这将意味着,如果您运行对帐户1的搜索,并要求查询返回1000个结果,但只有600个结果对应帐户1,最后400个结果将对应帐户10(词法上的下一个帐户号码)。所以你需要聪明一点,如何处理你的结果。>
如果你用前导0填充帐户id你可以这样做(这里也是伪代码)
ctx.PartionKey > "TextCache_0000000001"
&& ctx.PartitionKey < "TextCache_0000000002"
&& ctx.RowKey > "123465798"
其他要记住的是,查询Azure表返回他们的结果在PartitionKey
然后RowKey
顺序。因此,在您的情况下,没有ParentMessageId
的消息将在具有ParentMessageId
的消息之前返回。如果你不打算通过ParentMessageId
查询这个表,我将把它移到一个属性。
如果TextCache_
只是一个字符串常量,它不会通过包含在PartitionKey
中添加任何东西,除非它返回时对您的代码实际上有意义。
当你的第二个查询将运行,我不认为它会产生你想要的。如果您希望前十行按DateOfMessage
顺序排列,那么它将不起作用(参见我上面关于排序顺序的观点)。如果您按原样运行此查询,并且帐户1有11条消息,它将只返回与帐户1相关的前10条消息,无论帐户2是否有更早的消息。