如何解决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
我们需要上传一些文件夹,其中包含数百个具有各种结构和名称的文件夹和文件,但是您当然不能两次上传相同的文件,这会触发问题:
我们遇到了巨大的性能问题,因为目前正在检查文件夹是否存在:
-
从路径(对于每个文件夹)中获取所有文件夹名称。
-
查看根文件夹是否包含路径的第一个文件夹,然后查看其结果是否包含下一个文件夹,依此类推...
-
如果在某个时候该文件夹不存在,我们知道文件也不存在,因此我们可以上载和创建,如果在该行的末尾所有文件夹都存在,我们检查文件是否存在于最后一个文件夹。
-
为每个文件夹重复。
要使所有这些正常工作,我们有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 举报,一经查实,本站将立刻删除。