假设有一个论坛,其中包含主题列表和每个主题中的帖子列表。我想获取每个主题的帖子列表以及最新帖子(按日期)的标题。
是否可以使用EF Core(2.1)实现此目标?在SQL中可以这样做:
SELECT Posts.Title, Posts.CreatedDate, Posts.TopicId FROM
(SELECT Max(CreatedDate), TopicId FROM Posts GROUP BY TopicId) lastPosts
JOIN Posts ON Posts.CreatedDate = lastPosts.CreatedDate AND Posts.TopicId = lastPosts.TopicId
在EFCore中,我可以选择最后的日期(LastDates)
_context.Posts.GroupBy(x => x.TopicId, (x, y) => new
{
CreatedDate = y.Max(z => z.CreatedDate),
TopicId = x,
});
如果我运行 .ToList(),查询将被正确地转换为 GROUP BY
。
但是我无法继续执行。
接下来的操作将在内存中执行,而不是在SQL中(导致 SELECT * FROM Posts
):
.GroupBy(...)
.Select(x => new
{
x.TopicId,
Post = x.Posts.Where(z => z.CreatedDate == x.CreatedDate)
//Post = x.Posts.FirstOrDefault(z => z.CreatedDate == x.CreatedDate)
})
尝试连接导致NotSupportedException(无法解析表达式):
.GroupBy(...)
.Join(_context.Posts,
(x, y) => x.TopicId == y.TopicId && x.CreatedDate == y.CreatedDate,
(x, post) => new
{
post.Title,
post.CreatedDate,
})
我知道可以使用SELECT N+1(每个主题运行一个单独的查询)来实现,但我想避免这样做。