当表中存在记录时,Azure 表存储查询未从有效筛选器中检索任何实体

问题描述 投票:0回答:1

我正在使用 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 个条目)

仅供参考...我对表格重新设计非常满意,但我认为实际上并不需要它。

c# azure azure-storage azure-table-storage
1个回答
0
投票

我相信您的问题是您没有等待对数据库的

QueryAsync
调用。

将代码更改为此应该可以修复它:

var entities = await TableClient!.QueryAsync<DailyEventEntity>(filter);
foreach (var dee in entities) 
{
   results.Add(dee);
}
© www.soinside.com 2019 - 2024. All rights reserved.