C# LINQ/C:加入、分组并选择每个组中的最后一个?

C# LINQ/C:加入、分组并选择每个组中的最后一个?,c#,linq,C#,Linq,使用C和LINQ,我有一个员工表,其中只有一些是活跃的,还有一个事件表。我需要将事件表连接到ID上的员工,按员工分组事件并选择最新事件。我试过这方面的东西,但都被人盯着了,什么也没有 var emp = (from em in dc.Employees where (em.Active == true) join ev in dc.Events on em.ID equals ev.Employee orderby e

使用C和LINQ,我有一个员工表,其中只有一些是活跃的,还有一个事件表。我需要将事件表连接到ID上的员工,按员工分组事件并选择最新事件。我试过这方面的东西,但都被人盯着了,什么也没有

 var emp = (from em in dc.Employees
                   where (em.Active == true)
                   join ev in dc.Events on em.ID equals ev.Employee orderby ev.Time
好的,通过从另一个项目中分解一些旧代码,我得到了以下结果:

 var attends = dc.Events               
 .GroupBy(c => c.Employee)
 .Select(x => x.OrderByDescending(y => y.Time).FirstOrDefault())
 .Join(dc.Employees,u => u.Employee,o => o.ID,
        (u, o) => new { o.Name,u.Time,u.EventType}).ToList();
这似乎是可行的,但现在我需要过滤的员工积极是真的。。。我会在哪里做

好的。。。我认为敲打木头我得到了它,如果它帮助了其他人,这似乎做到了:

var attends = dc.Events                
 .GroupBy(c => c.Employee)
 .Select(x => x.OrderByDescending(y => y.Time).FirstOrDefault())
 .Join(dc.Employees.Where (z=>z.Active), u => u.Employee,o => o.ID, 
        (u, o) => new { o.Name,u.Time,u.EventType}).ToList();


    }

如果没有,我会哭着回来…

像这样的东西它可能不会编译:

var emp = (from ii in
        (from em in dc.Employees
               where (em.Active == true)
               join ev in dc.Events on em.ID equals ev.Employee 
        select new { Employee = ev.Employee, Event = ev.Eventid, EventTime = ev.Time})
        group ii by new {ii.EventId} into g
        select new 
        {
           Event = g.Key
        }).ToList();

看起来这很有效。。。很遗憾我投了反对票,因为显然有人觉得我没有做足够的家庭作业。希望这能帮助其他人:

    var attends = dc.Events                
 .GroupBy(c => c.Employee)
 .Select(x => x.OrderByDescending(y => y.Time).FirstOrDefault())
 .Join(dc.Employees.Where (z=>z.Active), u => u.Employee,o => o.ID, 
        (u, o) => new { o.Name,u.Time,u.EventType}).ToList();
我需要将事件表连接到ID上的员工,按员工分组事件并选择最新事件

在我看来,你需要一系列的员工,每个员工都有他的最新活动

通常,如果先执行连接,然后执行GroupBy,则也可以使用GroupJoin:

var employeesWithNewestEvents = employees.GroupJoin(events,
    employee => employee.Id,        // from each Employee take the primary key
    event => event.EmployeeId,      // from each event take the foreign key to Employee

    // ResultSelector: from each Employee with his zero or more Events, make a new
    (employee, eventsOfThisEmployee) => new
    {
         // select only the Employee properties you plan to use
        Id = employee.Id,
        Name = employee.Name,
        ...

        NewestEvent = eventsOfThisEmployee
            .OrderByDescending(event => event.Time)
            .Select(event => new
            {
                 // Select only the Event Properties you plan to use
                 Id = event.Id,
                 Description = event.Description,
                 ...

                 // not needed, you know the value: EmployeeId = event.EmployeeId
            })
            .FirstOrDefault(),
    })
请注意,没有事件的员工也将出现在所选数据中。对于NewestEvent,它们将具有空值

如果要选择完整的员工及其完整的最新事件,可以使用以下结果选择器:

(employee, eventsOfThisEmployee) => new
{
     Employee = employee,
     NewestEvent = eventsOfThisEmployee
        .OrderByDescending(event => event.Time)
        .FirstOrDefault(),
});

请注意,此方法将选择比实际需要更多的属性。

您面临的问题是什么?你有没有试着在linq学习加入和分组?基本上我不知道怎么做。我只是走了这么远,然后就不能在分组和从组中选择的问题上绞尽脑汁了。是的,我在网上找了一些例子,似乎有点困惑。你是通过id等于employee对象加入的。考虑把它变为E.ID等于EV。EmployeeID@jcruz,显然,这里的代码就是这样格式化的。ev.Employee是事件的属性,而不是对象。很抱歉造成混淆:我非常接近,我编辑了上面的代码。。。我只需要弄清楚如何只为active==true的员工选择;