我正在尝试从Azure函数查询Azure表存储示例,以根据特定条件(过滤器)检索单个或多个实体。
根据微软关于Azure.Data.Tables
SDK查询的文档(我使用的是v12.8.0
),在调用Query
时,通过将TableEntity
类型替换为自定义的强类型对象,应该可以做到这一点。他们的代码片段举例说明其功能如下
// Define a strongly typed entity by implementing the ITableEntity interface.
public class OfficeSupplyEntity : ITableEntity
{
public string Product { get; set; }
public double Price { get; set; }
public int Quantity { get; set; }
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public DateTimeOffset? Timestamp { get; set; }
public ETag ETag { get; set; }
}
...
// Given this model class definition, here is how you'd write a query
double priceCutOff = 6.00;
Pageable<OfficeSupplyEntity> queryResultsLINQ = tableClient.Query<OfficeSupplyEntity>(ent => ent.Price >= priceCutOff);
字符串
在此之后,我有一个这样定义的模型
public class MyModel : ITableEntity
{
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public DateTimeOffset? Timestamp { get; set; }
public ETag ETag { get; set; }
public int PropertyA { get; set; }
public string? PropertyB { get; set; }
public Guid? PropertyC { get; set; }
public Version PropertyD { get; set; }
public Version PropertyE { get; set; }
public Guid PropertyF { get; set; }
}
型
当我调用检索单个实体时,如下所示,实体属性被填充,并且自定义属性在对象Value
结果视图中可见。
Response<TableEntity> results = _tableClient.GetEntity<TableEntity>(partitionKey, recordKey);
型
但是,如果我尝试使用如下所示的自定义模型来检索它(遵循docs示例),则实体属性将由所有客户属性填充,并且所有客户属性都是其默认值。
Response<MyModel> results = _tableClient.GetEntity<MyModel>(partitionKey, recordKey);
型
当尝试在Guid属性PropertyC
上使用Query<MyModel>
和过滤器时也是如此(如下所示),Pageable<MyModel>
结果为空。大概是因为它无法将TableEntity
转换为MyModel
?
_tableClient.Query<MyModel>(e => e.PropertyC == PropertyC)
型
有谁知道为什么使用自定义模型进行查询不能像文档中预期的那样正确初始化?我考虑过创建一个自定义转换器,但是性能是这个函数的关键,因此需要最小的自定义代码开销。
更新
对于上下文,这些是表存储中的字段定义
PartitionKey
:String
RowKey
:String
Timestamp
:DateTimeOffset
PropertyA
:Int32
PropertyB
:String
PropertyC
:Guid
PropertyD
:String
PropertyE
:String
PropertyF
:Guid
在记录中,PropertyC
或PropertyD
可能有值,但不能同时有值或两者都没有。而PropertyF
将具有不同分区中另一个实体记录的RowKey
值。
1条答案
按热度按时间yrefmtwq1#
事实证明,套管很重要。属性在Table Storage中被定义为
propertyA
,但在模型中被定义为PropertyA
,这意味着它们无法被解析。在使用
GetEntity<T>
和Query<T>
时,将表存储中的自定义属性名称更新为大写字母,可以正确解析自定义对象。