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

Azure表存储投影查询和未实现异常

赫连实
2023-03-14

我有一个Person类,我将其保存到Azure表存储中的表中。

我想使用以下查询之一来查询它:

var query = from getThis in _serviceContext.CreateQuery<PersonForSearch>(_tableName)
                        where getThis.Name.Contains(searchTerm)
                        select new Person
                        {
                            PartitionKey = getThis.PartitionKey, 
                            RowKey = getThis.RowKey,
                            Name = getThis.Name
                        };

或者

CloudTableQuery<Person> query =
                 (from getThis in _serviceContext.CreateQuery<Person>(_tableName)
                  where getThis.Name.Contains(searchTerm)
                  select getThis).AsTableServiceQuery<Person>();

无论使用哪一种,我都会收到以下错误,抛出在我用来循环查询结果的foreach循环上:

未实现请求的操作未在指定的资源上实现。

我想这可能是因为我的Person模型没有继承TableServiceEntity(我拒绝引入这种耦合-所以我用这个属性来装饰它:[DataServiceKey("分区键","RowKey")]并手动给它一个分区键和RowKey属性。

因此,我试图创建一个 DID 从 TableServiceEntity 继承的实体,这将允许我查询此表(从查询中可以看出,我担心的唯一属性是 Name)。

这个新实体如下:

class PersonForSearch : TableServiceEntity
{
    public string Name { get; set; }
}

然而,这并没有解决问题。这个错误是不是在谈论我在查询中使用的类之外的其他资源?

共有1个答案

尉迟高澹
2023-03-14

这里有两个问题:

1)Azure表存储不支持包含()方法。这就是你得到未实现异常的原因。ATS确实支持对字符串进行任何范围类型操作的string.Compare()

2) 为了有效地检索数据,只能搜索PartitionKey或PartitionKey/RowKey组合。任何其他查询都会导致错误或将整个表下载到客户机内存中(无法记住是哪一个)。如果表很小,请删除“where”子句,将其完全下载到内存中,然后使用Linq for Objects进行查询。如果它很大,请找到一种方法与PartitionKey或PartitionKey/RowKey字段进行比较

若我理解您试图正确执行的操作,那个就是您试图对employee表执行部分字符串搜索。总的来说,ATS对于进行基于字符串的搜索不是一个很好的解决方案(除非这些搜索是从PartitionKey或PartitionKey/RowKey字段的搜索开始的)。我想极力推荐Lucene。NET用于在云中进行基于文本的搜索。Lucene有一个Azure Directory API。NET也可用。或切换到SQL Azure

HTH

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

  • 您好,从我的问题开始:Windows Azure表访问延迟分区键和行键选择有关我在 Azure 存储帐户中组织数据的方式。我有一个表存储方案,旨在存储有关实体的信息。 大约有4000-5000个实体。共有6种实体类型,类型大致均匀分布。所以每个大约800英尺。 参数键:实体类型-日期 行键:实体标识 随着问题的详细说明,我一直遇到延迟问题,查询多个分区似乎需要很长时间。 基本上,一个可能的解决方案

  • 问题内容: 您好,我想按查询排除某些字段。我正在使用nodejs 但在结果集中,我一直在获取密码字段。 问题答案: 投影不适用于新的nodejs mongodb驱动程序…相反,您将不得不在 此处使用游标方法

  • 问题内容: 我之所以来到这里,是因为我在Oracle数据库中没有足够的经验来解决这个问题。让我解释: 桌子 我有一个表,我们会打电话给 属性 ,包含3列: ID ,属性的ID, -edit:ENTITY_ID为好,它是指/编辑-实体 , TABLE_NAME ,包含表的名称,其中的存储该属性的值,以及 Column_name ,其中包含该表中存储该值的列的名称。 在 Table_name 列中引用

  • 我使用spring jpa规范动态构建实体查询。 它工作完美,但是查询返回所有实体字段,这使得性能变慢。我只想获取特定的实体字段,而不是获取我不想要也不会使用的所有实体字段和依赖项。 我在网上搜索,尝试了一些场景,但没有任何不足。有人能就此提出任何解决方案吗? 提前感谢 这是我的。我正在使用spring boot 2.2.4 规格: 存储库: 音乐会服务: ConcertServiceImpl:

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