GenerateFilterConditionOnDate 不起作用
GenerateFilterConditionOnDate not working
我创建了一个云服务,它从 Azure 存储的 WadWindowsEventLogs table 中获取数据,并从中 returns 一个 csv 文件。但是当我在 table 查询日期时生成过滤条件时,它 return 是一个空的 csv 文件,根本没有任何行。
我对 return 字符串的函数是
public string retrieveWADWindowsEventLogsTable()
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("DefaultConnectionString"));
CsvExport myExport = new CsvExport();
//Creating a table client
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
//getting reference to the desired table
CloudTable table = tableClient.GetTableReference("WADWindowsEventLogsTable");
TableQuery<WADWindowsEventLogsTableEntity> query = new TableQuery<WADWindowsEventLogsTableEntity>().Where(TableQuery.GenerateFilterConditionForDate("TimeStamp", QueryComparisons.GreaterThanOrEqual, new DateTime(2016,02,01)));
//For each row in table, creating the corresponding entry in CSV file
foreach (WADWindowsEventLogsTableEntity entity in table.ExecuteQuery(query))
{
//some code
}
var exp = myExport.Export();
return exp;
}
在那之后我有另一个函数将这个字符串转换成 csv,我认为在这个问题的上下文中不需要。
那么我的实体class是
public class WADWindowsEventLogsTableEntity : TableEntity
{
public WADWindowsEventLogsTableEntity()
{
}
//public string PartitionKey { get; set; }
//public string RowKey { get; set; }
public DateTime TimeStamp { get; set; }
public string Channel { get; set; }
public string DeploymentId { get; set; }
public string Description { get; set; }
public Int32 EventId { get; set; }
public Int64 EventTickCount { get; set; }
public Int32 Level { get; set; }
public Int32 Opcode { get; set; }
public Int32 Pid { get; set; }
public DateTime PreciseTimeStamp { get; set; }
public string ProviderGuid { get; set; }
public string ProviderName { get; set; }
public string RawXml { get; set; }
public string Role { get; set; }
public string RoleInstance { get; set; }
public string RowIndex { get; set; }
public DateTime TIMESTAMP { get; set; }
public Int32 Task { get; set; }
public Int32 Tid { get; set; }
}
感谢任何帮助
正如我在blog
中提到的,这些table中的PartitionKey
值实际上代表了创建日志的时间。它本质上是 DateTime
值的 Ticks
属性 附加了 0
。您需要做的是获取您感兴趣的 Date/Time,计算其 Ticks
值并在其前面加上 0
。然后在您的查询中使用该值。如下所示:
var dateTime = new DateTime(2016, 02, 01, 0, 0, 0, DateTimeKind.Utc);
var partitionKeyValue = "0" + dateTime.Ticks;
TableQuery<WADWindowsEventLogsTableEntity> query = new TableQuery<WADWindowsEventLogsTableEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.GreaterThanOrEqual, partitionKeyValue));
您的代码无法正常工作的原因是您在 Timestamp
属性上查询 table,该属性未被 Table 服务索引。因此,您的查询正在执行完整 table 扫描。如果您的 table 很大,那么它不会 return 除了延续标记之外的任何结果。您可以使用此延续令牌来获取下一组条目。
我创建了一个云服务,它从 Azure 存储的 WadWindowsEventLogs table 中获取数据,并从中 returns 一个 csv 文件。但是当我在 table 查询日期时生成过滤条件时,它 return 是一个空的 csv 文件,根本没有任何行。 我对 return 字符串的函数是
public string retrieveWADWindowsEventLogsTable()
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("DefaultConnectionString"));
CsvExport myExport = new CsvExport();
//Creating a table client
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
//getting reference to the desired table
CloudTable table = tableClient.GetTableReference("WADWindowsEventLogsTable");
TableQuery<WADWindowsEventLogsTableEntity> query = new TableQuery<WADWindowsEventLogsTableEntity>().Where(TableQuery.GenerateFilterConditionForDate("TimeStamp", QueryComparisons.GreaterThanOrEqual, new DateTime(2016,02,01)));
//For each row in table, creating the corresponding entry in CSV file
foreach (WADWindowsEventLogsTableEntity entity in table.ExecuteQuery(query))
{
//some code
}
var exp = myExport.Export();
return exp;
}
在那之后我有另一个函数将这个字符串转换成 csv,我认为在这个问题的上下文中不需要。 那么我的实体class是
public class WADWindowsEventLogsTableEntity : TableEntity
{
public WADWindowsEventLogsTableEntity()
{
}
//public string PartitionKey { get; set; }
//public string RowKey { get; set; }
public DateTime TimeStamp { get; set; }
public string Channel { get; set; }
public string DeploymentId { get; set; }
public string Description { get; set; }
public Int32 EventId { get; set; }
public Int64 EventTickCount { get; set; }
public Int32 Level { get; set; }
public Int32 Opcode { get; set; }
public Int32 Pid { get; set; }
public DateTime PreciseTimeStamp { get; set; }
public string ProviderGuid { get; set; }
public string ProviderName { get; set; }
public string RawXml { get; set; }
public string Role { get; set; }
public string RoleInstance { get; set; }
public string RowIndex { get; set; }
public DateTime TIMESTAMP { get; set; }
public Int32 Task { get; set; }
public Int32 Tid { get; set; }
}
感谢任何帮助
正如我在blog
中提到的,这些table中的PartitionKey
值实际上代表了创建日志的时间。它本质上是 DateTime
值的 Ticks
属性 附加了 0
。您需要做的是获取您感兴趣的 Date/Time,计算其 Ticks
值并在其前面加上 0
。然后在您的查询中使用该值。如下所示:
var dateTime = new DateTime(2016, 02, 01, 0, 0, 0, DateTimeKind.Utc);
var partitionKeyValue = "0" + dateTime.Ticks;
TableQuery<WADWindowsEventLogsTableEntity> query = new TableQuery<WADWindowsEventLogsTableEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.GreaterThanOrEqual, partitionKeyValue));
您的代码无法正常工作的原因是您在 Timestamp
属性上查询 table,该属性未被 Table 服务索引。因此,您的查询正在执行完整 table 扫描。如果您的 table 很大,那么它不会 return 除了延续标记之外的任何结果。您可以使用此延续令牌来获取下一组条目。