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()查询来重做此操作,但我想知道是否有一种方法可以只用一个查询来做到这一点。

谢谢。

LINQ 最新测试与条件匹配的元素

你会做这样的事情:

MyDC.Actions
    .GroupBy(x => x.UserID)
    .Select(g => g.OrderByDescending(x => x.ActionTime)
                  .First())
    .Where(x => TheActionType.Contains(x.ActionType))
    .Select(x => x.ActionID);

这将执行以下操作:

  1. UserID对操作进行分组
  2. 对于每个用户,选择具有最高ActionTime的操作,换句话说:它选择最年轻的操作。
  3. 结果按允许的操作类型列表进行筛选。
  4. 从其余操作中选择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();