c# - EF Core 不返回超过 3 个子对象

标签 c# asp.net-core entity-framework-core

我的应用程序中有一个文件夹结构,我想在其中递归地检索父项下的所有子项。

//Pseudocode
Context.Files.Include(p => p.Children);

如果我的 parent 有 3 个 child ,我会检索 IEnumerable<Files> Parent.Children.Children.Children ..但是,当我有超过 3 个 child 时,它只返回第一个子对象,即 File.Children

子属性在我的对象类中编写如下:

public virtual ICollection<Files> Children { get; set; }

我在这里忽略了什么?

最佳答案

问题是 .Include 不会生成递归 SQL。它只是将 Children 的外部关系集连接到您的 Files,这应该是一个嵌套很深的关系。

如果您要拉取整个文件集(带有 .Include 子项),那么您将拥有一组边缘片段。为了将一组边 block 变成一个连接图,您需要在代码中手动组合它。

创建一个方法,该方法将迭代每个文件对象,如果它与子集相关,则将其连接到那里。这将创建您的对象图并允许您以您期望的方式进行遍历。

为了提高性能,请创建一个自上而下的 GUID 列进行链接,以便您可以仅提取您感兴趣的文件树。

如果您知道您感兴趣的确切深度,那么您可以手动编写包含内容。或者,您可以创建一个自定义表达式生成器来动态执行此操作,但这超出了本答案的范围。

Context.Files.Include(
    p => p.Children.Select( 
        pc => pc.Children.Select( 
            pcc => pcc.Children
        )
    )
);

关于c# - EF Core 不返回超过 3 个子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62854494/

相关文章:

c# - WCF "Always generate message contracts"不生成 MessageContract

c# - LINQ 查询仅加入最后一个值

asp.net-core - 什么是以及如何在 project.json 中选择依赖类型

asp.net-core - 是否有用于在 EF7/.Net Core 3 中实现抽象 DbContext 以避免跨项目共享实体/配置重复的良好模式?

c# - 有条件地包含和 ThenInclude

c# - 使用 C# 在 Windows 事件查看器中创建文件夹

c# - 在 LINQ 中使用 .first 时,当序列不包含任何元素时,有没有办法设置默认值?

c# - 将 ASP.NET Core 2.1 预览应用程序部署到 Azure

entity-framework - Entity Framework 核心: InvalidOperationException

c# - EF 核心枚举列表