gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:52:51 35 4
gpt4 key购买 nike

我使用的是 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 ge '2023-08-26' and RowKey le '2023-08-30'

表服务方法返回实体的零项,因此无法转换为结果。 (是的,我会解决这个问题,这样就不会出错)

entities result

表中有应检索的有效项目:

valid items

TableClient 不是问题(恕我直言),因为它创建正确,并且适​​用于服务中的其他 12 个方法(在不同的表上操作,这是迄今为止该表的唯一方法,也是唯一的方法)我没有使用分区键作为搜索的一部分,是的,我知道这不太好,但是这个表每两周就会被清除和重新获取一次,并且很少有超过 100 个条目)

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

最佳答案

已编辑:事实上 @dinotom 是对的,并且 QueryAsync 不可等待,所以我原来的答案已经偏离了。

我开始认为问题出在用于对 string 值进行比较的 gele 运算符中。 查询过滤器

据我所知,过滤永远无法确定某个值是否大于或小于字符串值,即使它最初是从日期值中获取的并且格式为“有效”。

我相信,为了使其正常工作,您必须在 RowKey 值前面加上 datetime 才能使其正常工作。

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 datetime{start} and RowKey le datetime{endDate}");
}

我现在无法测试它,但您可能需要将 T00:00:00 附加到您的 {start}{endDate} 字符串,以便转换/比较正常工作。

使用日期构建过滤字符串的文档 here.

关于c# - 当表中存在记录时,Azure 表存储查询不会从有效筛选器中检索任何实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76976624/

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