private TableQuery<LogEntity> MapQuery(AzureNLogQueryDefinition originalQuery)
    {
      var query = new TableQuery<LogEntity>();
      var filters = new[]
      {
        this.GetPartitionKeyFilter(originalQuery), this.GetMinDateFilter(originalQuery),
        this.GetMaxDateFilter(originalQuery), this.GetLevelFilter(originalQuery)
      }
        .Where(f => !string.IsNullOrWhiteSpace(f))
        .ToArray();

      if (!filters.Any())
      {
        return query;
      }

      var querySt = filters[0];

      for (var i = 1; i < filters.Length; i++)
      {
        querySt = TableQuery.CombineFilters(querySt, TableOperators.And, filters[i]);
      }

      return query.Where(querySt);
    }
    private string GetMinDateFilter(AzureNLogQueryDefinition originalQuery)
    {
      if (originalQuery.MinimumDate == null)
      {
        return null;
      }

      return TableQuery.GenerateFilterCondition(nameof(LogEntity.RowKey), QueryComparisons.GreaterThanOrEqual,
        this.StringifyDate(originalQuery.MinimumDate.Value));
    }
    public async Task<IEnumerable<LogEntity>> GetLogsAsync(AzureNLogQueryDefinition query, int? maxResults)
    {
      var queryBody = this.MapQuery(query);

      var table = this.GetTable();

      var results = new List<LogEntity>();

      TableContinuationToken token = null;

      do
      {
        var seg = await table.ExecuteQuerySegmentedAsync(queryBody, token);
        token = seg.ContinuationToken;
        results.AddRange(seg.Results);
      } while (token != null && results.Count < (maxResults ?? int.MaxValue));

      return results.OrderByDescending(r => r.LogTimeStamp).Take(maxResults ?? int.MaxValue);
    }
 private string GetMaxDateFilter(AzureNLogQueryDefinition originalQuery)
 {
   return originalQuery.MaximumDate == null
     ? null
     : TableQuery.GenerateFilterCondition(nameof(LogEntity.RowKey), QueryComparisons.LessThanOrEqual,
       this.StringifyDate(originalQuery.MaximumDate.Value));
 }
 private string GetPartitionKeyFilter(AzureNLogQueryDefinition originalQuery)
 {
   return string.IsNullOrWhiteSpace(originalQuery.PartitionKey)
     ? null
     : this.GetStringStartsWithQuery(nameof(LogEntity.PartitionKey), originalQuery.PartitionKey);
 }
    public IEnumerable<LogEntity> GetLogs(AzureNLogQueryDefinition query)
    {
      var queryBody = this.MapQuery(query);

      return this.GetTable().ExecuteQuery(queryBody);
    }
 private string GetLevelFilter(AzureNLogQueryDefinition originalQuery)
 {
   return originalQuery.Level == null
     ? null
     : TableQuery.GenerateFilterCondition(nameof(LogEntity.Level), QueryComparisons.Equal, originalQuery.Level);
 }