Как получить максимальную отметку времени и сгруппировать по другому полю в LINQ to Entities

У меня есть сущность со следующими полями: 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. Все мои попытки добавить максимум к выражению терпят неудачу. Публикация (http://stackoverflow.com/questions/2034800/how-do-you-find-the-group-wise-max-in-linq) казалась близкой, но я не мог перевести ее во что-то работающее. Возможно, нужен foreach.


person Blanthor    schedule 30.11.2010    source источник


Ответы (2)


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

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
    };
person StriplingWarrior    schedule 30.11.2010

person    schedule
comment
Хороший. Мне нравится, как вы составили тест. Я обязательно создам такую ​​последовательность в следующий раз, когда у меня возникнет вопрос в LINQ. Это работает очень хорошо. - person Blanthor; 01.12.2010
comment
Увы, Single не поддерживается LINQ to Entities, хотя ваш пример работает хорошо. - person Blanthor; 01.12.2010