C# LINQ/C:加入、分组并选择每个组中的最后一个?
使用C和LINQ,我有一个员工表,其中只有一些是活跃的,还有一个事件表。我需要将事件表连接到ID上的员工,按员工分组事件并选择最新事件。我试过这方面的东西,但都被人盯着了,什么也没有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
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的员工选择;