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 除了延续标记之外的任何结果。您可以使用此延续令牌来获取下一组条目。