LINQ 最新测试与条件匹配的元素
本文关键字:元素 条件 最新 测试 LINQ | 更新日期: 2023-09-27 18:35:39
>我有一个看起来像这样的表格:
ActionID | ActionTime | ActionType | UserID
1 3/22/2013 4 8
2 3/31/2013 1 8
3 4/12/2013 3 8
每个操作都有几个操作时间,我想获取用户的所有操作ID,其中最新的操作时间属于某种操作类型。
这是我的查询,但在我测试它时,它没有按预期工作:
var TheActionType = list of bytes (ie. [1, 3, 5])
(from a in MyDC.Actions
where a.UserID == TheUserID
where TheActionType.Contains(a.ActionType)
orderby a.ActionTime descending (//I only want the last ActionTime each user)
select a.ActionID).ToList();
因此,如果我在 ActionType 中传入 [4,1],我应该不会得到任何内容,因为最后一个 ActionTime 的 ActionType 为 3。
基本上,我知道我可以通过首先使用 orderby
和 .FirstOrDefault()
获取最新的 ActionID,然后使用字节列表运行第二个.Contains()
查询来重做此操作,但我想知道是否有一种方法可以只用一个查询来做到这一点。
谢谢。
你会做这样的事情:
MyDC.Actions
.GroupBy(x => x.UserID)
.Select(g => g.OrderByDescending(x => x.ActionTime)
.First())
.Where(x => TheActionType.Contains(x.ActionType))
.Select(x => x.ActionID);
这将执行以下操作:
- 按
UserID
对操作进行分组 - 对于每个用户,选择具有最高
ActionTime
的操作,换句话说:它选择最年轻的操作。 - 结果按允许的操作类型列表进行筛选。
- 从其余操作中选择
ActionID
。
示例:http://ideone.com/KbwPBI
我按用户ID删除了过滤器,因为您说
我只想要每个用户的最后一个操作时间
因此,如果此查询与指定的操作类型匹配,则此查询返回每个用户的最后一个操作 ID。
如果您确实只需要单个用户的最新操作,则只需在上一个查询中添加该Where
:
MyDC.Actions
.Where(x => x.UserID == TheUserID)
.GroupBy(x => x.UserID)
.Select(g => g.OrderByDescending(x => x.ActionTime)
.First())
.Where(x => TheActionType.Contains(x.ActionType))
.Select(x => x.ActionID)
.SingleOrDefault();