C# 子/组的Linq查询最多两次

C# 子/组的Linq查询最多两次,c#,linq,C#,Linq,如何获取具有最新EventDate和AccessTime的EMP?首先,获取具有最新EventDate的项目。如果EventDates相同,则获取具有最新AccessTime的项。对于此列表,结果应为事件6和9 您要找的是OrderBy,然后是By。以您的例子为例: public class Event { public int Id { get; set; } public string Emp { get; set; } public DateTime EventDa

如何获取具有最新EventDate和AccessTime的EMP?首先,获取具有最新EventDate的项目。如果EventDates相同,则获取具有最新AccessTime的项。对于此列表,结果应为事件6和9

您要找的是OrderBy,然后是By。以您的例子为例:

public class Event
{
    public int Id { get; set; }
    public string Emp { get; set; }
    public DateTime EventDate { get; set; }
    public DateTime AccessTime { get; set; }
}

var events = new List<Event>(){
    new Event(){Id=1,Emp ="A",EventDate= new DateTime(2017, 1, 2), AccessTime= DateTime.Now},
    new Event(){Id=2,Emp ="A",EventDate= new DateTime(2017, 1, 2), AccessTime= DateTime.Now.AddMinutes(4)},
    new Event(){Id=3,Emp ="A",EventDate= new DateTime(2017, 1, 2), AccessTime= DateTime.Now.AddMinutes(1)},
    new Event(){Id=4,Emp ="A",EventDate= new DateTime(2017, 1, 3), AccessTime= DateTime.Now},
    new Event(){Id=5,Emp ="A",EventDate= new DateTime(2017, 1, 3), AccessTime= DateTime.Now.AddMinutes(2)},
    new Event(){Id=6,Emp ="A",EventDate= new DateTime(2017, 1, 3), AccessTime= DateTime.Now.AddMinutes(3)},
    new Event(){Id=7,Emp ="B",EventDate= new DateTime(2017, 2, 2), AccessTime= DateTime.Now},
    new Event(){Id=8,Emp ="B",EventDate= new DateTime(2017, 2, 2), AccessTime= DateTime.Now.AddMinutes(1)},
    new Event(){Id=9,Emp ="B",EventDate= new DateTime(2017, 2, 2), AccessTime= DateTime.Now.AddMinutes(2)}
}; 
这将首先按最新的EventDate排序事件,然后按AccessTime排序,以防多个日期匹配

结果的ID为9,后面跟着8,因为它们具有最新的EventDate,而在两个ID中,9具有最新的AccessTime


这将为您提供您想要的:

events.OrderByDescending(x => x.EventDate)
    .ThenByDescending(x => x.AccessTime);
首先,您需要按Emp分组,然后按EventDate降序,然后按AccessTime排序,然后选择第一行

最终结果将是:

九, 六,


你试过什么了吗?你为什么说分组,听起来你只是想要一个简单的订单,对吗?events.orderByDowningx=>x.EventDate.ThenByDowningx=>x.AccessTime?为什么结果中没有2?对不起,我的问题应该更清楚。它是按Emp分组的,Emp应该只在结果中出现一次。结果应该是这样的:6 A 2017年1月3日12:00:00 AM 2017年5月15日3:48:57 PM 9 B 2017年2月2日12:00:00 AM 2017年5月15日3:47:57PM@david我已经更新了我的答案,所以结果就是你所需要的
var result = events.GroupBy(x => x.Emp).Select(y => y.OrderByDescending(z => z.EventDate).ThenByDescending(q => q.AccessTime).First());
foreach (Event a in result)
{
            Console.WriteLine(a.Id + "\t" + a.Emp + "\t" + a.EventDate + "\t" + a.AccessTime);
}