Как я могу использовать Linq / Linq to Sql, чтобы сделать это? - PullRequest
1 голос
/ 17 февраля 2010

У меня есть таблица аудита, и я пытаюсь использовать 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

Может кто-нибудь помочь, пожалуйста?

(О, и если мне нужно что-то проиндексировать, предложите, пожалуйста, какой столбец).

Спасибо, любезно :) 1015 *

Ответы [ 2 ]

4 голосов
/ 17 февраля 2010

Я думаю, что это будет выглядеть примерно так:

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. Также запись "MostRecent", вероятно, даст вам все, что вам нужно. Вот еще один запрос, адресованный обеим точкам:

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

Добавление индексов для CreatedOn и UserName.

1 голос
/ 27 марта 2017

Еще один простой способ:

List<Audit> result = ctx.Audit.GroupBy(g => g.UserName)
                        .Select(t => t.OrderByDescending(o => o.CreatedOn)
                                      .Select(s => s)
                                      .First())
                        .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...