我是LinQ技术的新手。我的程序生成操作(移动文件,删除文件......)并将每个操作的状态保存在数据库中。假设法规只是传递(1)或失败(0)。虽然我的行动不成功,但我再试一次。对于每个试验,我在我的数据库中写了一行:
ID ProcessedOn ActionID Description Status
--- ----------------------- --------- ------------ ------
20 2011-05-20 10:45:01.440 24871 xxx 0
21 2011-05-20 10:45:09.080 24873 xxx 0
22 2011-05-20 11:00:01.993 24871 xxx 0
23 2011-05-20 11:00:10.477 24873 xxx 1
24 2011-05-20 11:15:08.127 24871 xxx 1
我想写一个LINQ查询来检索2时刻之间每个动作的最新状态。这可能吗?
我已经写过:
MyTable.Where(t => t.ProcessedOn >= start).Where(t => t.ProcessedOn <=
stop).OrderBy(t => t.ProcessedOn).ToList();
此请求需要一个附加条件才能保留最后一个状态。我需要为每个ActionID保留ProcessedOn更长的时间。
答案 0 :(得分:4)
您可以尝试按ActionID分组,而不是仅提取最后一项
MyTable
.Where(t => t.ProcessedOn >= start)
.Where(t => t.ProcessedOn <= stop)
.GroupBy(t => t.ActionID)
.Select(t => t.OrderBy(t => t.ProcessedOn).Last())
.ToList();
答案 1 :(得分:3)
您想要使用GroupBy
运算符:
MyTable
.Where(t => t.ProcessedOn >= start && t.ProcessedOn <= stop)
.GroupBy(t => t.ActionID)
.Select(g => new {
Action = g.Key,
LastStatus =
g.Where(a => a.ProcessedOn == g.Max(a2 => a2.ProcessedOn) )
.Single().Status
})
.ToList();