我的应用程序中有一个文件夹结构,我想在其中递归地检索父项下的所有子项。
//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/