具有自定义对象类型的查询无法转换Azure表存储中的自定义字段

14ifxucb  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(101)

我正在尝试从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)


有谁知道为什么使用自定义模型进行查询不能像文档中预期的那样正确初始化?我考虑过创建一个自定义转换器,但是性能是这个函数的关键,因此需要最小的自定义代码开销。

更新

对于上下文,这些是表存储中的字段定义

  • PartitionKeyString
  • RowKeyString
  • TimestampDateTimeOffset
  • PropertyAInt32
  • PropertyBString
  • PropertyCGuid
  • PropertyDString
  • PropertyEString
  • PropertyFGuid

在记录中,PropertyCPropertyD可能有值,但不能同时有值或两者都没有。而PropertyF将具有不同分区中另一个实体记录的RowKey值。

yrefmtwq

yrefmtwq1#

事实证明,套管很重要。属性在Table Storage中被定义为propertyA,但在模型中被定义为PropertyA,这意味着它们无法被解析。
在使用GetEntity<T>Query<T>时,将表存储中的自定义属性名称更新为大写字母,可以正确解析自定义对象。

相关问题