gpt4 book ai didi

c# - EF Core 2.1 GROUP BY 并选择每组中的第一项

转载 作者:行者123 更新时间:2023-12-02 00:13:32 25 4
gpt4 key购买 nike

让我们想象一个论坛,其中包含主题和帖子列表。我想获取每个主题的主题列表和最后一篇文章的标题(按日期)。

有没有办法使用 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)
})

尝试 JOIN 会出现 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(每个主题运行单独的查询)来完成此操作,但我想避免这种情况。

最佳答案

我不知道从哪个版本的 EFCore 开始可以实现这一点,但现在有一个更简单的单查询替代方案:

context.Topic
.SelectMany(topic => topic.Posts.OrderByDescending(z => z.CreatedDate).Take(1),
(topic, post) => new {topic.Id, topic.Title, post.Text, post.CreatedDate})
.OrderByDescending(x => x.CreatedDate)
.ToList();

关于c# - EF Core 2.1 GROUP BY 并选择每组中的第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51924531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com