当前位置: 首页 > 知识库问答 >
问题:

常用条件包装在方法中的Azure表存储范围查询

王宏深
2023-03-14

在我的应用程序中有一个常见的情况,我创建了一个查询来获取partitionkey为常量但rowkey应在词法范围内的所有实体(例如,仅以某个前缀开头的行):

//query to get all entities in partition "KnownPartition" where RowKey starts with "Prefix_"
CloudTableQuery<MyEntity> query =
    (from e in tableServiceContext.CreateQuery<MyEntity>(tableName)
     where e.PartitionKey == "KnownPartition"
           && e.RowKey.CompareTo("Prefix_") > 0
           && e.RowKey.CompareTo("Prefix`") <= 0 // ` is '_' + 1
     select e).AsTableServiceQuery();

我必须使用CompareTo,因为这类查询不支持StartsWith等字符串函数。这是可行的,但条件是很难读和重复了很多。因此,我不想用这种难懂的条件编写大量的查询,而是想做一个“内联”它的函数:

public static Boolean HasPrefix(this String rowKey, String prefix)
{
    return rowKey.CompareTo(prefix + '_') > 0 && rowKey.CompareTo(prefix + '`') <= 0;
}

CloudTableQuery<MyEntity> query =
    (from e in tableServiceContext.CreateQuery<MyEntity>(tableName)
     where e.PartitionKey == "KnownPartition" && e.RowKey.HasPrefix("Prefix")
     select e).AsTableServiceQuery();

但是当我运行它时,我从Azure得到一个关于我的函数不被支持的异常。有没有什么方法可以这样写使它得到支持?毕竟,我使用的条件与查询完全相同,只是封装在函数中。

共有1个答案

商池暝
2023-03-14

如果将条件分解为一个函数,则该函数需要返回表达式树而不是布尔值。我不知道LINQ查询语法是否会支持这一点,但您可以使用方法语法做到这一点,如下所示:

public static Expression<Func<MyEntity, bool>> HasPrefix(String prefix) 
{ 
    return e => e.RowKey.CompareTo(prefix + '_') > 0 && e.RowKey.CompareTo(prefix + '`') <= 0;
}

CloudTableQuery<MyEntity> query =
    (from e in tableServiceContext.CreateQuery<MyEntity>(tableName)
    where e.PartitionKey == "KnownPartition"
    select e)
    .Where(HasPrefix("Prefix"))
    .AsTableServiceQuery();
 类似资料:
  • 您好,从我的问题开始:Windows Azure表访问延迟分区键和行键选择有关我在 Azure 存储帐户中组织数据的方式。我有一个表存储方案,旨在存储有关实体的信息。 大约有4000-5000个实体。共有6种实体类型,类型大致均匀分布。所以每个大约800英尺。 参数键:实体类型-日期 行键:实体标识 随着问题的详细说明,我一直遇到延迟问题,查询多个分区似乎需要很长时间。 基本上,一个可能的解决方案

  • 问题内容: 我有很多不同提供商的IP范围。例如 我将此IP转换为int32: 我的任务: 通过用户IP地址查找提供者名称(例如192.168.2.20(3232236052)) 在MySQL中很简单: Redis怎么做? 问题答案: 这取决于您是否认为您的IP范围可以重叠。如果不是,则解决方案非常简单: 使用哈希的集合来存储提供者数据 使用zset索引范围的最大值 检索最大值大于IP的(唯一)范围

  • 这个问题涉及这里描述的Azure表存储中的性能目标阈值。特别是,我关心的是每个分区2K个实体,每秒20K个实体的阈值。我的理解是,如果你越过这些阈值,Azure可能会开始返回500和503个错误。 我想我可能遇到了这个问题,我正在寻找关于这些项目到底是如何计算的澄清。我知道,如果您对整个表或一个分区执行扫描,那么您可能会为Azure扫描的每个实体“收费”,而不管您返回的数字是多少。由于您可以在一个

  • 我试图使用rest API从azure数据表中检索数据。 Api错误已输出,数据无效。 如果我同时添加RowKey和PartitionKey,就像下面这样。它起作用了。 是否需要通过行键? 如果我只想从一个分区检索所有数据。我知道,我们可以在查询参数中添加一个$filter,但这不会导致性能问题吗? 请分享你的想法。 谢谢!

  • 我试图通过PartitionKey和RowKey从Azure表存储中检索一个实体。当我的表中确实有一个实体带有这些键时,这种方法非常有效。 但是,当没有找到带有for键的实体时,我只是收到一个相当不清楚的错误,说“其中一个请求输入无效”…… 未处理的拒绝存储错误:其中一个请求输入无效。 有没有办法检查特定分区和行密钥是否存在实体?

  • 使用扩展度量,我试图检索特定VM的特定度量。每个查询似乎花费的时间都非常长,因为表中每隔15秒就会为每个VM创建新的记录。 所以我试图在最后5分钟内查询该表,但它不起作用,并给我一个错误。有人知道如何查询这些WADMETRICS表吗?