LINQ查询使用实体框架查找嵌套数据链的末端

如何解决LINQ查询使用实体框架查找嵌套数据链的末端

我们正在将一些文件上传到服务器,并将其数据保存在数据库中以供访问(出于安全性考虑,它们在服务器本身会收到一个随机生成的名称),当我们需要进行一些检查以查看文件是否存在时,问题就来了或一个文件夹已经存在,如现在所示,每个文件夹都具有子文件夹,并且该子文件夹可以具有子文件夹,依此类推...。每个文件夹还具有一个“ ParentfolderID”,因此我们知道它属于哪个文件夹(根文件夹将具有ParentfolderID == null),我们可以上下导航,文件夹和文件的名称会重复很多次,因此我们可以轻松地拥有以下结构:

Root Folder> foldername 1> foldername 2> foldername 3> foldername 4> files

Root Folder> foldername 1> foldername 2> foldername 3> foldername 5> files

Root Folder> foldername 4> foldername 3> foldername 4> files

Root Folder> foldername 1> foldername 2> foldername 3> foldername 6> foldername 1> files

我们需要上传一些文件夹,其中包含数百个具有各种结构和名称的文件夹和文件,但是您当然不能两次上传相同的文件,这会触发问题

我们遇到了巨大的性能问题,因为目前正在检查文件夹是否存在:

  1. 从路径(对于每个文件夹)中获取所有文件夹名称。

  2. 查看根文件夹是否包含路径的第一个文件夹,然后查看其结果是否包含下一个文件夹,依此类推...

  3. 如果在某个时候该文件夹不存在,我们知道文件也不存在,因此我们可以上载和创建,如果在该行的末尾所有文件夹都存在,我们检查文件是否存在于最后一个文件夹。

  4. 为每个文件夹重复。

要使所有这些正常工作,我们有3个表:文件夹,文件和文档(这是文件夹和文件之间的关系表)。

最后,代码最终是这样的:

//we loop across each folder path to see if the files with that path are already there
//this code will repeat for every single folder that the user is currently uploading

 private List<string> CheckForExistingFiles(string folderPath,Folder currentFolder,string[] fileNames)
{
        var individualFolders = folderPath.Split('\\');
        var existingFiles = new List<string>();

        for (int i = 0; i < individualFolders.Count(); i++)
        {
            currentFolder = currentFolder.SubFolders.SingleOrDefault(x => x.Name == individualFolders[i]);

            if (currentFolder == null)
            {
                return null;
            }
        }

            //we know that the folder exists,now we check if this folder contains this file

            var filesThatAlreadyExist = this.context.Documents.Where(x => x.FolderId == currentFolder.Id && fileNames.Contains(x.File.Name)).Select(x=>x.Name);

            if (filesThatAlreadyExist.Any())
            {
                existingFiles.AddRange(filesThatAlreadyExist.ToList());
            }        

            return existingFiles;
}

此代码当然效率极低,它会循环访问过多的数据并进行过多的数据库操作以查看是否存在文件夹,然后我们仍然需要检查该文件夹中是否有该名称的文件,并同时抓取所有文件夹,因此一次只能访问数据库也不是一件好事。当我们尝试以另一种方式导航到给定文件夹的“根文件夹”时,我们也会遇到问题,因为这时我们需要向后循环直到到达根文件夹。

我告诉我的经理,我想更改数据结构以向每个文件夹和文件添加完整路径,因此,如果该路径已经存在,将可以非常容易地进行比较,从而简化了整个路径处理很多,但是他强烈不同意,因为他说我们在任何方向上导航所需的一切已经存在,我们只需要找到一种有效的方法即可做到这一点,但这是对的,但是在我做的每一次测试中,我最终都做了一些循环或接收比我需要更多的数据,所以我仍然想知道是否存储每个文件夹和文件的完整路径是否比在循环访问如此多的数据上花费大量精力更有意义。

我需要实现的目标:

高效的LINQ查询,在这里我可以找到“行的结尾”而不必遍历所有数据以查看是否存在每个子文件夹,因此通过具有string[] paths数组如下所示:

根文件夹\文件夹名称1 \文件夹名称2 \文件夹名称3 \文件夹名称4 \文件

根文件夹\文件夹名称1 \文件夹名称3 \文件夹名称6 \文件夹名称4 \文件

我想检查文件名是否已经存在,所以我想从根文件夹中抓取嵌套数据的末尾(唯一可以确定的是那是因为用户正在向其上载其他任何内容,存在)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res