Подтвердить что ты не робот

Entity Framework выбирает одну из каждой группы по дате

У меня есть таблица, подобная этой (имя таблицы: сообщения):

+----+--------------------------+-------+------------+
| id |         content          | type  |    date    |
+----+--------------------------+-------+------------+
|  0 | Some text                | TypeA | 2013-04-01 |
|  1 | Some older text          | TypeA | 2012-03-01 |
|  2 | Some even older texttext | TypeA | 2011-01-01 |
|  3 | A dog                    | TypeB | 2013-04-01 |
|  4 | And older dog            | TypeB | 2012-03-01 |
|  5 | An even older dog        | TypeB | 2011-01-01 |
+----+--------------------------+-------+------------+

Используя выражение LINQ, я хочу найти новейшее содержимое каждого типа, поэтому результат должен быть

Some text | TypeA 
A dog     | TypeB

Я пробовал несколько вещей, но не хочу указывать на неработающие выражения.

4b9b3361

Ответ 1

Если вы хотите получить все сообщения. Вы можете попробовать следующее:

var query = Posts.GroupBy(p => p.Type)
                  .Select(g => g.OrderByDescending(p => p.Date)
                                .FirstOrDefault()
                   )

Ответ 2

Я предполагаю, что вы можете группировать свои столбцы Posts по типу, а затем выбирать первый контент по убыванию, упорядоченный по дате коллекции этого типа

from row in Posts 
group row by row.type 
into g
select new
{       
    Content  = (from row2 in g orderby row2.date descending select row2.content).FirstOrDefault(),
    Type = g.Key
}

Ответ 3

Или используя временный результат и предикат

var tmp = posts.GroupBy(x => x.type).Select(x => new {x.Key, date = x.Max(g => g.date)).ToArray();

var filter = PredicateBuilder.False<Post>();

foreach (var item in tmp)
{
    filter = filter.Or(x => x.type == item.Key && x.date == item.date);
}

var newestPosts = posts.Where(filter);

Ответ 4

Из памяти, что-то вроде этого должно это сделать

var data = context.Posts.Group(p => p.Type)
                        .Select(g => new { 
                                          Type = g.Key, 
                                          Date = g.OrderByDescending(p => p.Date)
                                                  .FirstOrDefault()
                                         }

Это даст вам новый анонимный тип, но вы всегда можете сопоставить его с классом