我正在使用 Azure.Data.Tables 库版本 12.8。
ITableEntity如下:
public sealed class DailyEventEntity : ITableEntity
{
private const string Format = AzureConstants.AzureFormats.AzureTableDateFormat;
public DailyEventEntity()
{ }
public DailyEventEntity(IReadOnlyList<string> lineParts)
{
// for loading from .csv file
PartitionKey = lineParts[0];
RowKey = Convert.ToDateTime(lineParts[1]).Date.ToString(Format);
EventTitle = lineParts[2];
EventType = ConvertBackToEventType(int.Parse(lineParts[3]));
EventTime = lineParts[4];
SurveyPeriod = lineParts[5];
ExpectedValue = lineParts[6];
PriorValue = lineParts[7];
}
// interface properties
public string PartitionKey { get; set; } //Event ticker
public string RowKey { get; set; } // Event date
public DateTimeOffset? Timestamp { get; set; }
public ETag ETag { get; set; }
// custom properties
public string EventTitle { get; set; }
public EventType EventType { get; set; }
public string EventTime { get; set; }
public string SurveyPeriod { get; set; }
public string ExpectedValue { get; set; }
public string PriorValue { get; set; }
// helper methods
private static EventType ConvertBackToEventType(int intToParse)
{
return intToParse switch
{
0 => EventType.Earnings,
1 => EventType.EconomicData,
2 => EventType.CommodityData,
_ => EventType.Other,
};
}
}
构建过滤器的方法如下:
public static string GenerateDailyEventsFilter(int numOfEventDaysToShow)
{
const string dateFormat = AzureConstants.AzureFormats.AzureTableDateFormat;
var now = DateTime.Now;
var start = now.AddDays(1).ToString(dateFormat);
var additionalDays = now.DayOfWeek switch
{
DayOfWeek.Saturday => 1,
DayOfWeek.Wednesday or DayOfWeek.Thursday or DayOfWeek.Friday => 2,
_ => 0
};
var endDate = now.AddDays(numOfEventDaysToShow + additionalDays).ToString(dateFormat);
return TableClient.CreateQueryFilter($"RowKey ge {start} and RowKey le {endDate}");
}
数据检索方法如下:
public async Task<IEnumerable<DailyEventEntity>> GetDailyEventsAsync()
{
var results = new List<DailyEventEntity>();
var filter = EquityNoteQueryFilters.GenerateDailyEventsFilter(3);
try
{
var entities = TableClient!.QueryAsync<DailyEventEntity>(filter);
results = (List<DailyEventEntity>)await entities.ToListAsync();
Log.Information("Retrieved {Count} daily events", results.Count);
//await foreach (var entity in TableClient!.QueryAsync<DailyEventEntity>(filter))
//{
// results.Add(entity);
//}
}
catch (RequestFailedException ex)
{
Log.Error(_baseErrorMessage, Environment.NewLine, ex.Message, Environment.NewLine, ex.InnerException);
}
catch (Exception ex)
{
Log.Error(_baseErrorMessage, Environment.NewLine, ex.Message, Environment.NewLine, ex.InnerException);
}
return results;
}
这是查询过滤器返回的内容:
RowKey 为“2023-08-26”,RowKey 为“2023-08-30”
表服务方法返回实体的零项,因此无法转换为结果。 (是的,我会解决这个问题,这样就不会出错)
表中有应检索的有效项目:
TableClient 不是问题(恕我直言),因为它创建正确,并且适用于服务中的其他 12 种方法(在不同的表上操作,这是迄今为止该表的唯一方法,也是我唯一使用的方法)我没有使用分区键作为搜索的一部分,是的,我知道这不太好,但该表每两周就会被清除和重新获取一次,并且很少有超过 100 个条目)
仅供参考...我对表格重新设计非常满意,但我认为实际上并不需要它。
我相信您的问题是您没有等待对数据库的
QueryAsync
调用。
将代码更改为此应该可以修复它:
var entities = await TableClient!.QueryAsync<DailyEventEntity>(filter);
foreach (var dee in entities)
{
results.Add(dee);
}