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
Я пробовал несколько вещей, но не хочу указывать на неработающие выражения.
Ответы
Ответ 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()
}
Это даст вам новый анонимный тип, но вы всегда можете сопоставить его с классом