我如何使用Linq / Linq来执行此操作?

时间:2010-02-17 07:33:44

标签: c# .net linq linq-to-sql linq-to-entities

我有一个审计表,我正在尝试使用Linq来弄清楚如何抓住所有人最近的审计行动。我只是不确定如何。

示例架构

审计表(从技术上讲,它实际上是一种观点)

AuditId   UserName   Action    CreatedOn
1         Bob        Action1   2000-01-01
2         Bob        Action2   2000-01-02
3         Bob        Action8   2000-01-03
4         Jane       Action1   2000-01-01
5         Bob        Action1   2000-01-05
6         Jane       Action3   2000-01-05
7         Andrew     Action4   2000-01-05
8         Siena      Action1   2000-01-06
9         Sarah      Action1   2000-01-07
10        Harry      Action6   2000-01-09

所以,对于结果,我会追上......

5, Bob, Action1, 2000-01-05
6, Jane, Action3, 2000-01-05
7, Andrew, Action4, 2000-01-05
8, Siena, Action1, 2000-01-06
9, Sarah, Action1, 2000-01-07
10, Harry, Action6, 2000-01-09

有人可以帮忙吗?

(哦,如果我需要索引某些内容,请建议使用哪个列。)

谢天谢地:)

2 个答案:

答案 0 :(得分:4)

我认为这看起来像这样:

var query = from action in db.Actions
            orderby action.CreatedOn descending
            group action by action.UserName into groupedActions
            let mostRecent = groupedActions.First()
            select new { UserName = groupedActions.Key,
                         LatestId = mostRecent.AuditId,
                         LatestAction = mostRecent.Action,
                         LatestDate = mostRecent.CreatedOn };

如评论中所述,这适用于LINQ to Objects,但分组可能不会保留SQL中的顺序。此外,“最近”的记录可能会为您提供所需的一切。这是针对这两点的另一个问题:

var query = from action in db.Actions
            group action by action.UserName into groupedActions
            select groupedActions.OrderByDescending(a => a.CreatedOn).First();

为CreatedOn和UserName添加索引。

答案 1 :(得分:1)

另一种简单的方法是:

List<Audit> result = ctx.Audit.GroupBy(g => g.UserName)
                        .Select(t => t.OrderByDescending(o => o.CreatedOn)
                                      .Select(s => s)
                                      .First())
                        .ToList();
相关问题