gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:22:43 27 4
gpt4 key购买 nike

我有一个 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("PartitionKey", "RowKey")]并手动给它一个 PartitionKey 和 RowKey 属性。

因此,我尝试创建一个 DID 继承自 TableServiceEntity 的实体,这将允许我查询该表(正如您从查询中看到的,我唯一担心的属性是 Name)。

这个新实体如下:

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

但是,这并没有解决问题。此错误是否涉及我在查询中使用的类以外的其他资源?

最佳答案

这里有两个问题:

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

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

如果我理解您想要正确执行的操作,那就是您正在尝试通过员工表进行部分字符串搜索。总体而言,对于进行基于字符串的搜索,ATS 并不是一个非常好的解决方案(除非这些是对 PartitionKey 或 PartitionKey/RowKey 字段进行“开头”搜索)。我强烈推荐Lucene.NET用于在云中进行基于文本的搜索。有一个Azure Directory API Lucene.NET 也可用。或者切换到 SQL Azure

HTH

关于Azure表存储投影查询和未实现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13437153/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com