实体框架-包括每​​个父级的上顶N

Pac*_*man 5 linq linq-to-entities entity-framework linq-to-sql

我正在建立一个论坛,每个帖子都可以发表评论。

我想加载一批N个帖子,因此每个帖子都加载前K条评论。

我已经从此代码开始,但是目前每个帖子包含所有评论。如何仅在每个帖子中加载前K条评论,而不必对数据库进行K条调用?

List<ForumPost> result = ctx
                            .ForumPosts
                            .Include("Comments") // <-- ??? How to take first K ???
                            .Where(i => i.Thread.ID == threadID)
                            .OrderByDescending(i => i.Date)
                            .Take(N).ToList();
Run Code Online (Sandbox Code Playgroud)

谢谢!

Jot*_*aBe 5

当前,在EF中,您无法Include以任何方式过滤或限制d个相关实体。

如果您需要避免多个查询,则有解决方案,但是它们都涉及直接在SQL端进行工作。您可以使用:TVF(表值函数),存储过程,视图或简单查询。在每种情况下,都有不同的解决方案可将结果映射到您的实体。并且映射的实体将是不可跟踪的,因此您无法修改它们并将它们写回到服务器(除非您将它们显式添加到现有的DbContext

您可以阅读Julie Lerman的这篇文章,以了解我在说什么:使用投影和存储库伪造经过过滤的热负荷

您可以通过“ 数据用户”的声音为相关功能投票。查找“允许对包含扩展方法进行过滤”。最有可能的是,如果实现了这一点,也可以.Take在这种情况下使用。

有关此功能演变的更多信息,请查看EF Core github第1833期:支持过滤的Include。在这里您可以找到有趣的东西,例如: