private async Task<IEnumerable<WadPerformanceCounterEntity>> BeginGetPerformanceCounterEntries(Subscription subscription, DateTime fromDate, DateTime? toDate, string role, string counterName)
		{
			CloudStorageAccount storageAccount = CloudStorageAccount.Parse(String.Format("DefaultEndpointsProtocol=http;AccountName={0};AccountKey={1}", subscription.AccountName, subscription.AccountKey));

			CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

			CloudTable table = tableClient.GetTableReference("WADPerformanceCountersTable");

			string filter = String.Format("(PartitionKey ge '0{0}')", fromDate.ToUniversalTime().Ticks);

			if (toDate != null)
				filter += String.Format("and (PartitionKey le '0{0}')", toDate.Value.ToUniversalTime().Ticks);

			filter += String.Format(" and (Role eq '{0}')", role);
			filter += String.Format(" and (CounterName eq '{0}')", counterName);

			var logQuery = new TableQuery<WadPerformanceCounterEntity>() { FilterString = filter };

			return await Task.Factory.StartNew(() =>
			{
				IEnumerable<WadPerformanceCounterEntity> entries = table.ExecuteQuery(logQuery);

				return entries;
			});
		}
		private async Task<IEnumerable<WadLogEntity>> BeginGetEventLogEntries(Subscription subscription, DateTime fromDate, DateTime? toDate, int? logLevel, string query, string messagePattern)
		{
			CloudStorageAccount storageAccount = CloudStorageAccount.Parse(String.Format("DefaultEndpointsProtocol=http;AccountName={0};AccountKey={1}", subscription.AccountName, subscription.AccountKey));

			CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

			CloudTable table = tableClient.GetTableReference("WADLogsTable");

			string filter = String.Format("(PartitionKey ge '0{0}')", fromDate.ToUniversalTime().Ticks);

			if (toDate != null)
				filter += String.Format("and (PartitionKey le '0{0}')", toDate.Value.ToUniversalTime().Ticks);

			if (!String.IsNullOrEmpty(query))
				filter += String.Format(" and ({0})", query);

			if (logLevel != null)
				filter += String.Format(" and (Level eq {0})", logLevel);

			var logQuery = new TableQuery<WadLogEntity>() { FilterString = filter };

			return await Task.Factory.StartNew(() =>
				{
					IEnumerable<WadLogEntity> entries = table.ExecuteQuery(logQuery);

					if (!String.IsNullOrEmpty(messagePattern))
					{
						Regex regex = new Regex(messagePattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);

						entries = entries.Where(e => regex.IsMatch(e.Message));
					}
					return entries;
				});
		}