Как получить максимальную временную метку и сгруппировать другое поле в LINQ to Entities - PullRequest
2 голосов
/ 01 декабря 2010

У меня есть объект со следующими полями GUID TaskId, GUID SubTaskId, DateTime Timestamp

TaskId может быть один-ко-многим с SubTaskId.Это почти как составной ключ почти.

Я хотел бы написать выражение или выражения, приводящие к появлению самого нового среди каждого TaskId, т.е.

TaskId SubTaskId Timestamp
1 A 2010-11-22 15: 48: 49.727
1 B 2010-11-22 16: 24: 51.117
2 C 2010-11-15 11: 49: 05.717
2 D 2010-11-15 14: 02: 11.467

Результатом будет последовательность, содержащая только:
TaskId SubTaskId Timestamp
1 B 2010-11-22 16: 24: 51.117
2 D 2010-11-15 14: 02: 11.467

Это выражение прекрасно работает для отображения всех TaskId и TimeStamps

var q1 = 
    from req in myEntity
    orderby req.TaskId
    select new
    {
        req.TaskId,
        req.SubTaskId,
        req.Timestamp
    };

но я бы хотел показывать только последнюю метку времени для каждого TaskId.Все мои попытки добавить макс в выражение провалились.Пост (/1722088/kak-vy-nahodite-gruppovoi-maksimum-v-linq) показался близким, но я не смог перевести его во что-то работающее. Возможно, нужен foreach.

Ответы [ 2 ]

2 голосов
/ 01 декабря 2010

Как насчет этого?

var q1 = 
    from req in myEntity
    group req by req.TaskId into g
    let topReq = g.OrderByDescending(r => r.Timestamp).FirstOrDefault()
    select new
    {
        topReq.TaskId,
        topReq.SubTaskId,
        topReq.Timestamp
    };
1 голос
/ 01 декабря 2010
var tasks = new[] { 
new { TaskId = 1, SubTaskId = "A", Timestamp = DateTime.Parse("2010-11-22 15:48:49.727")},
new { TaskId = 1, SubTaskId = "B", Timestamp = DateTime.Parse("2010-11-22 16:24:51.117")},
new { TaskId = 2, SubTaskId = "C", Timestamp = DateTime.Parse("2010-11-15 11:49:05.717")},
new { TaskId = 2, SubTaskId = "D", Timestamp = DateTime.Parse("2010-11-15 14:02:11.467")}};


var newestTasks = 
    from task in tasks
    group task by task.TaskId into g
    select g.Where(t => t.Timestamp == g.Max(t2 => t2.Timestamp)).Single();

foreach (var task in newestTasks)
    Console.WriteLine("TaskId = {0}, SubTaskId = {1}, Timestamp = {2}", 
        task.TaskId, task.SubTaskId, task.Timestamp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...