实体框架按日期选择每个组中的一个

Tod*_*ilo 25 c# linq 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 |
+----+--------------------------+-------+------------+
Run Code Online (Sandbox Code Playgroud)

使用LINQ表达式我想找到每种类型的最新内容,所以结果应该是

Some text | TypeA 
A dog     | TypeB
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一些事情,但没有指出非工作表达式.

Kha*_* TO 57

如果你想获得整个帖子.你可以试试这个:

var query = Posts.GroupBy(p => p.Type)
                  .Select(g => g.OrderByDescending(p => p.Date)
                                .FirstOrDefault()
                   )
Run Code Online (Sandbox Code Playgroud)

  • group by 是在运行查询之前还是之后运行?那么它会从数据库中提取每一行然后将它们分组还是将一个 group by 语句添加到查询中以便只提取分组的行? (3认同)
  • @Samir:这确实是一个很好的观点。根据 EF 上的版本,它似乎有不同的行为。EF 7 似乎将数据加载到客户端并在那里进行分组: /sf/ask/809501801/ 。EF core似乎支持sql group by:https://github.com/aspnet/EntityFrameworkCore/pull/9872。为了确认这一点,您可以使用探查器来查看实际的 SQL 查询。 (2认同)
  • 只需确认一下,EF Core 2.1不会在服务器端进行分组。问题在于,遵循GroupBy的所有运算符都在客户端上运行,包括.Take(n)运算符。因此,GroupBy(..)。Take(n)将加载所有记录。 (2认同)