Как получить последнюю запись WADLogsTable, которая находится ниже 1000?

Я кодировал для получения последнего диагностического журнала из wadlogstable в C#, но он просматривает все записи и затем дает последнюю запись ex. в таблице 5000 записей, но мне нужна только последняя или последняя 1000 записей, но она выдает все записи, затем после заказа по запросу выдает последние 1000 записей, так что это очень много времени, это занимает почти 7-8 минут, чтобы увидеть 4000-5000 записей

 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ATCommon.DiagnosticConfig);
        CloudTableClient cloudTableClient = storageAccount.CreateCloudTableClient();
        TableServiceContext serviceContext = cloudTableClient.GetDataServiceContext();
        IQueryable<WadLogEntity> traceLogsTable = serviceContext.CreateQuery<WadLogEntity>("WADLogsTable");
        var selection = from row in traceLogsTable where row.PartitionKey.CompareTo("0" + DateTime.UtcNow.AddHours(hours).Ticks) >= 0 select row;
        //var selection = from row in traceLogsTable where row.PartitionKey.CompareTo("0" + DateTime.UtcNow.AddMinutes(-5.0).Ticks) >= 0 select row;
        CloudTableQuery<WadLogEntity> query = selection.AsTableServiceQuery<WadLogEntity>();
        IEnumerable<WadLogEntity> output = query.Execute();
return output.OrderByDescending(s => s.Timestamp).ToList();

2 ответа

Решение

У меня более 500 миллионов записей. и каждую секунду это добавляет больше..

string apiLogTableName = "yourtableName";
StorageTable apiLogsTable = new StorageTable(apiLogTableName);

 string filter1 = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, date);   //hear you can check with ticks


 string filter2 = TableQuery.GenerateFilterConditionForInt("yourColumn", QueryComparisons.Equal, yourValue);

            string filter3 = TableQuery.GenerateFilterCondition("YourColumn2", QueryComparisons.NotEqual, "YourValue2");



            TableQuery<ApiCallLogEntity> findapiLogsRecord = new TableQuery<ApiCallLogEntity>().Where(TableQuery.CombineFilters(

                TableQuery.CombineFilters(
                            filter1,
                            TableOperators.And,
                            filter2),
                TableOperators.And, filter3));

//you can use
//var records= apiLogsTable._table.ExecuteQuery(findapiLogsRecord)


//bellow code will get one-one records // time consuming
            foreach (ApiCallLogEntity entity in apiLogsTable._table.ExecuteQuery(findapiLogsRecord))
            {
                Console.WriteLine("{0}, {1}\t{2}\t{3}", entity.PartitionKey, entity.RowKey,
                    entity.Action, entity.RequestBody);


                tw.WriteLine("{0}, {1}\t{2}\t{3}\t{4}", entity.PartitionKey, entity.RowKey,
                    entity.Action, entity.RequestBody, entity.ResponseBody);
            }

Вы можете попытаться добиться этого с помощью хитрости, используя значение RowKey DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks, чтобы позволить вам сортировать элементы по смещенному времени от новых элементов к более старым элементам. Сделав это, вы можете сначала получить результаты в правильном порядке или самые последние добавленные элементы, а затем ограничить результаты самыми последними 1000 строками с помощью параметра .Take(1000). проверьте детали в этом блоге.

Другие вопросы по тегам