使用Linq将每天最早的条目分组

时间:2016-10-03 09:51:46

标签: c# 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中执行类似的查询?

3 个答案:

答案 0 :(得分:5)

在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 :(得分:-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

答案 2 :(得分:-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();
相关问题