2016-10-03 2 views
1

Попытка получить голову вокруг Linq и в то же время следить за временем, которое я запишу в первой половине дня, и это должно быть время, когда я попаду в офис.Группировка самой ранней записи на каждый день с использованием Linq

Мой кода до сих пор:

EventLog SecurityLog = new EventLog("Security"); 

var AccountLoggedOnEntries = SecurityLog.Entries.Cast<EventLogEntry>() 
    .Where(x => x.InstanceId == 4624) 
    .Select(x => new 
    { 
     DateGenerated = x.TimeGenerated.ToShortDateString() 
     , 
     TimeGenerated = x.TimeGenerated.ToShortTimeString() 
     , 
     x.Message 
    }) 
    .ToList(); 

DgvLogSummary.DataSource = AccountLoggedOnEntries; 

DgvLogSummary.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

Я хочу, чтобы фильтровать результаты, так что у меня есть только одна записи на каждый день, который является самым ранним временем.

В SQL я обычно принимаю сообщение самой ранней записи, а затем группирую все поля.

Как выполнить аналогичный запрос в Linq?

+0

Самое раннее вступление? Вы пытались использовать MIN() или MAX() в Linq? –

+0

Вид. Я не знаю, что делаю. Моя голова очень в режиме SQL –

ответ

4

В LINQ вы бы группа по, сортировки каждой группы и выбрать первый пункт:

var AccountLoggedOnEntries = log.Entries.Cast<EventLogEntry>() 
    .Where(x => x.InstanceId == 4624) 
    .GroupBy(x => x.TimeGenerated.Date) 
    .Select(g => g.OrderBy(x => x.TimeGenerated).First()) 
    .Select(x => new { 
     DateGenerated = x.TimeGenerated.ToShortDateString() 
    , TimeGenerated = x.TimeGenerated.ToShortTimeString() 
    , x.Message 
    }) 
    .ToList(); 
-1

Вы можете GroupBy дату, а затем выбрать минимальное время

var AccountLoggedOnEntries = log.Entries.Cast<EventLogEntry>() 
    .Where(x => x.InstanceId == 4624) 
    .GroupBy(x => x.TimeGenerated.Date) 
    .Select(x => new { 
     DateGenerated = x.Key 
     , TimeGenerated = x.Min(y => y.TimeGenerated).ToShortTimeString() 
    }) 
    .ToList(); 

Получение соответствующего Message немного сложнее. Один простой вариант - использовать x.First().Message в приведенной выше картине Select.

-1

Попробуйте это:

var AccountLoggedOnEntries = log.Entries.Cast<EventLogEntry>() 
       .Where(x => x.InstanceId == 4624) 
       .GroupBy(x => x.TimeGenerated.Date) 
       .Select(days => days.OrderBy(time => time.TimeGenerated).FirstOrDefault()) 
       .Select(x => new 
       { 
        DateGenerated = x.TimeGenerated.ToShortDateString() 
        , 
        TimeGenerated = x.TimeGenerated.ToShortTimeString() 
        , 
        x.Message 
       }) 
       .ToList(); 
Смежные вопросы