Я создал веб-приложение ASP.NET для просмотра данных из журнала событий Windows с использованием элементов управления с привязкой к данным.Данные извлекаются через ObjectDataSource
, подключенный к классу-посреднику, который обращается к EventLog
.Когда я подключаю GridView
к ObjectDataSource
, он хочет посчитать строки в EventLog
.Я могу сделать это просто и быстро с помощью:
var log = new EventLog {Log = logName};
return log.Entries.Count;
С моей ненаучной точки зрения, это, кажется, возвращается в O (1).Однако, если я хочу подсчитать записи, которые происходят до определенной даты или поступают через определенный источник событий, я не могу найти способ их эффективного подсчета.Я пробовал WMI-запросы, такие как:
var query = new ObjectQuery("Select * from Win32_NTLogEvent
where LogFile='Application'");
var searcher = new ManagementObjectSearcher(query);
var result = searcher.Get();
var foo = result.Count;
Для журнала событий с 70 тыс. Записей это занимает порядка минуты на моей рабочей станции с достаточной нагрузкой.Это похоже на O (N).Я также попытался отфильтровать log.Entries
с помощью Linq и получить аналогичные результаты.
Есть ли более эффективный способ сделать это?Что касается фактических данных в сетке, я обнаружил, что цикл по log.Entries
и доступ через индекс являются очень эффективным способом получения коллекции записей.