fix in @my

This commit is contained in:
Nikita 2022-05-26 13:24:12 +03:00
parent 4a0e61de7c
commit 52e2925c8f
5 changed files with 60 additions and 59 deletions

View File

@ -99,12 +99,12 @@ public class AbstractDao
return set.AsQueryable().Where(r => r.TenantId == tenantId);
}
protected internal IQueryable<DbFile> GetFileQuery(Expression<Func<DbFile, bool>> where)
protected internal IQueryable<DbFile> GetFileQuery(Expression<Func<DbFile, bool>> where, FilesDbContext filesDbContext = null)
{
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
return Query(FilesDbContext.Files)
var query = Query(filesDbContext.Files)
.Where(where);
return query;
}
protected async Task GetRecalculateFilesCountUpdateAsync(int folderId)

View File

@ -131,8 +131,7 @@ internal class FileDao : AbstractDao, IFileDao<int>
private async Task<File<int>> InternalGetFileAsync(int parentId, string title)
{
var query = GetFileQuery(r => r.Title == title && r.CurrentVersion && r.ParentId == parentId)
.AsNoTracking()
var query = GetFileQuery(r => r.Title == title && r.CurrentVersion && r.ParentId == parentId).AsNoTracking()
.OrderBy(r => r.CreateOn);
var dbFile = await FromQueryWithShared(query).FirstOrDefaultAsync().ConfigureAwait(false);
@ -142,8 +141,7 @@ internal class FileDao : AbstractDao, IFileDao<int>
public async Task<File<int>> GetFileStableAsync(int fileId, int fileVersion = -1)
{
var query = GetFileQuery(r => r.Id == fileId && r.Forcesave == ForcesaveType.None)
.AsNoTracking();
var query = GetFileQuery(r => r.Id == fileId && r.Forcesave == ForcesaveType.None).AsNoTracking();
if (fileVersion >= 0)
{
@ -172,8 +170,7 @@ internal class FileDao : AbstractDao, IFileDao<int>
return AsyncEnumerable.Empty<File<int>>();
}
var query = GetFileQuery(r => fileIds.Contains(r.Id) && r.CurrentVersion)
.AsNoTracking();
var query = GetFileQuery(r => fileIds.Contains(r.Id) && r.CurrentVersion).AsNoTracking();
return FromQueryWithShared(query).AsAsyncEnumerable()
.Select(e => _mapper.Map<DbFileQuery, File<int>>(e));
@ -251,7 +248,6 @@ internal class FileDao : AbstractDao, IFileDao<int>
public IAsyncEnumerable<File<int>> GetFilesAsync(int parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false)
{
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
if (filterType == FilterType.FoldersOnly)
{
@ -263,14 +259,16 @@ internal class FileDao : AbstractDao, IFileDao<int>
orderBy = new OrderBy(SortedByType.DateAndTime, false);
}
var q = GetFileQuery(r => r.ParentId == parentId && r.CurrentVersion).AsNoTracking();
var filesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var q = GetFileQuery(r => r.ParentId == parentId && r.CurrentVersion, filesDbContext).AsNoTracking();
if (withSubfolders)
{
q = GetFileQuery(r => r.CurrentVersion)
q= GetFileQuery(r => r.CurrentVersion, filesDbContext)
.AsNoTracking()
.Join(FilesDbContext.Tree, r => r.ParentId, a => a.FolderId, (file, tree) => new { file, tree })
.Join(filesDbContext.Tree, r => r.ParentId, a => a.FolderId, (file, tree) => new { file, tree })
.Where(r => r.tree.ParentId == parentId)
.Select(r => r.file);
}
@ -331,7 +329,7 @@ internal class FileDao : AbstractDao, IFileDao<int>
break;
}
return FromQueryWithShared(q).AsAsyncEnumerable()
return FromQueryWithShared(q, filesDbContext).AsAsyncEnumerable()
.Select(_mapper.Map<DbFileQuery, File<int>>);
}
@ -1550,19 +1548,17 @@ internal class FileDao : AbstractDao, IFileDao<int>
};
}
protected IQueryable<DbFileQuery> FromQueryWithShared(IQueryable<DbFile> dbFiles)
protected IQueryable<DbFileQuery> FromQueryWithShared(IQueryable<DbFile> dbFiles, FilesDbContext filesDbContext = null)
{
var cId = _authContext.CurrentAccount.ID;
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
return from r in dbFiles
select new DbFileQuery
{
File = r,
Root = (from f in FilesDbContext.Folders.AsQueryable()
Root = (from f in filesDbContext.Folders.AsQueryable()
where f.Id ==
(from t in FilesDbContext.Tree.AsQueryable()
(from t in filesDbContext.Tree.AsQueryable()
where t.FolderId == r.ParentId
orderby t.Level descending
select t.ParentId
@ -1570,11 +1566,11 @@ internal class FileDao : AbstractDao, IFileDao<int>
where f.TenantId == r.TenantId
select f
).FirstOrDefault(),
Shared = (from f in FilesDbContext.Security.AsQueryable()
Shared = (from f in filesDbContext.Security.AsQueryable()
where f.EntryType == FileEntryType.File && f.EntryId == r.Id.ToString() && f.TenantId == r.TenantId
select f
).Any(),
IsFillFormDraft = (from f in FilesDbContext.FilesLink
IsFillFormDraft = (from f in filesDbContext.FilesLink
where f.TenantId == r.TenantId && f.LinkedId == r.Id.ToString() && f.LinkedFor == cId
select f)
.Any()
@ -1585,7 +1581,7 @@ internal class FileDao : AbstractDao, IFileDao<int>
{
var cId = _authContext.CurrentAccount.ID;
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
return dbFiles
.Select(r => new DbFileQuery

View File

@ -91,9 +91,11 @@ internal class FolderDao : AbstractDao, IFolderDao<int>
public async Task<Folder<int>> GetFolderAsync(int folderId)
{
var query = GetFolderQuery(r => r.Id == folderId).AsNoTracking();
using var filesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var dbFolder = await FromQueryWithShared(query).Take(1).SingleOrDefaultAsync().ConfigureAwait(false);
var query = GetFolderQuery(r => r.Id == folderId, filesDbContext).AsNoTracking();
var dbFolder = await FromQueryWithShared(query, filesDbContext).Take(1).SingleOrDefaultAsync().ConfigureAwait(false);
return _mapper.Map<DbFolderQuery, Folder<int>>(dbFolder);
}
@ -176,16 +178,16 @@ internal class FolderDao : AbstractDao, IFolderDao<int>
orderBy = new OrderBy(SortedByType.DateAndTime, false);
}
var q = GetFolderQuery(r => r.ParentId == parentId).AsNoTracking();
var filesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var q = GetFolderQuery(r => r.ParentId == parentId, filesDbContext).AsNoTracking();
if (withSubfolders)
{
q = GetFolderQuery().AsNoTracking()
.Join(FilesDbContext.Tree, r => r.Id, a => a.FolderId, (folder, tree) => new { folder, tree })
.Where(r => r.tree.ParentId == parentId && r.tree.Level != 0)
.Select(r => r.folder);
q = GetFolderQuery(null, filesDbContext).AsNoTracking()
.Join(FilesDbContext.Tree, r => r.Id, a => a.FolderId, (folder, tree) => new { folder, tree })
.Where(r => r.tree.ParentId == parentId && r.tree.Level != 0)
.Select(r => r.folder);
}
if (!string.IsNullOrEmpty(searchText))
@ -221,7 +223,7 @@ internal class FolderDao : AbstractDao, IFolderDao<int>
}
}
var dbFolders = FromQueryWithShared(q).AsAsyncEnumerable();
var dbFolders = FromQueryWithShared(q, filesDbContext).AsAsyncEnumerable();
return dbFolders.Select(_mapper.Map<DbFolderQuery, Folder<int>>);
}
@ -236,13 +238,13 @@ internal class FolderDao : AbstractDao, IFolderDao<int>
return AsyncEnumerable.Empty<Folder<int>>();
}
var q = GetFolderQuery(r => folderIds.Contains(r.Id)).AsNoTracking();
var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var q = GetFolderQuery(r => folderIds.Contains(r.Id), FilesDbContext).AsNoTracking();
if (searchSubfolders)
{
q = GetFolderQuery()
q = GetFolderQuery(null, FilesDbContext)
.AsNoTracking()
.Join(FilesDbContext.Tree, r => r.Id, a => a.FolderId, (folder, tree) => new { folder, tree })
.Where(r => folderIds.Contains(r.tree.ParentId))
@ -279,23 +281,23 @@ internal class FolderDao : AbstractDao, IFolderDao<int>
}
}
var dbFolders = (checkShare ? FromQueryWithShared(q) : FromQuery(q)).AsAsyncEnumerable();
var dbFolders = (checkShare ? FromQueryWithShared(q, FilesDbContext) : FromQuery(q, FilesDbContext)).AsAsyncEnumerable();
return dbFolders.Select(_mapper.Map<DbFolderQuery, Folder<int>>).Distinct();
}
public async Task<List<Folder<int>>> GetParentFoldersAsync(int folderId)
{
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
using var filesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var q = GetFolderQuery()
var q = GetFolderQuery(null, filesDbContext)
.AsNoTracking()
.Join(FilesDbContext.Tree, r => r.Id, a => a.ParentId, (folder, tree) => new { folder, tree })
.Join(filesDbContext.Tree, r => r.Id, a => a.ParentId, (folder, tree) => new { folder, tree })
.Where(r => r.tree.FolderId == folderId)
.OrderByDescending(r => r.tree.Level)
.Select(r => r.folder);
var query = await FromQueryWithShared(q).ToListAsync().ConfigureAwait(false);
var query = await FromQueryWithShared(q, filesDbContext).ToListAsync().ConfigureAwait(false);
return _mapper.Map<List<DbFolderQuery>, List<Folder<int>>>(query);
}
@ -1161,11 +1163,9 @@ internal class FolderDao : AbstractDao, IFolderDao<int>
#endregion
protected internal IQueryable<DbFolder> GetFolderQuery(Expression<Func<DbFolder, bool>> where = null)
protected internal IQueryable<DbFolder> GetFolderQuery(Expression<Func<DbFolder, bool>> where = null, FilesDbContext filesDbContext = null)
{
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var q = Query(FilesDbContext.Folders);
var q = Query(filesDbContext.Folders);
if (where != null)
{
q = q.Where(where);
@ -1174,9 +1174,9 @@ internal class FolderDao : AbstractDao, IFolderDao<int>
return q;
}
protected IQueryable<DbFolderQuery> FromQueryWithShared(IQueryable<DbFolder> dbFiles)
protected IQueryable<DbFolderQuery> FromQueryWithShared(IQueryable<DbFolder> dbFiles, FilesDbContext filesDbContext = null)
{
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var FilesDbContext = filesDbContext ?? base.FilesDbContext;
var e = from r in dbFiles
select new DbFolderQuery
@ -1201,9 +1201,9 @@ internal class FolderDao : AbstractDao, IFolderDao<int>
return e;
}
protected IQueryable<DbFolderQuery> FromQuery(IQueryable<DbFolder> dbFiles)
protected IQueryable<DbFolderQuery> FromQuery(IQueryable<DbFolder> dbFiles, FilesDbContext filesDbContext = null)
{
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var FilesDbContext = filesDbContext;
return dbFiles
.Select(r => new DbFolderQuery

View File

@ -389,7 +389,7 @@ internal class SecurityDao<T> : AbstractDao, ISecurityDao<T>
private IQueryable<DbFilesSecurity> GetQuery(Expression<Func<DbFilesSecurity, bool>> where = null)
{
using var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var FilesDbContext = DbContextManager.GetNew(FileConstant.DatabaseId);
var q = Query(FilesDbContext.Security);
if (q != null)

View File

@ -497,11 +497,14 @@ public class EntryManager
{
var folderDao = _daoFactory.GetFolderDao<T>();
var fileDao = _daoFactory.GetFileDao<T>();
var folders = await folderDao.GetFoldersAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, withSubfolders).ToListAsync();
entries = entries.Concat(await fileSecurity.FilterReadAsync(folders));
var files = await fileDao.GetFilesAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, searchInContent, withSubfolders).ToListAsync();
entries = entries.Concat(await fileSecurity.FilterReadAsync(files));
var folders = folderDao.GetFoldersAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, withSubfolders).ToListAsync();
entries = entries.Concat(await fileSecurity.FilterReadAsync(await folders));
var files = fileDao.GetFilesAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, searchInContent, withSubfolders).ToListAsync();
entries = entries.Concat(await fileSecurity.FilterReadAsync(await files));
//share
var shared = await fileSecurity.GetPrivacyForMeAsync(filter, subjectGroup, subjectId, searchText, searchInContent, withSubfolders);
@ -516,12 +519,14 @@ public class EntryManager
{
withSubfolders = false;
}
var folders = await _daoFactory.GetFolderDao<T>().GetFoldersAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, withSubfolders).ToListAsync();
entries = entries.Concat(await fileSecurity.FilterReadAsync(folders));
var files = await _daoFactory.GetFileDao<T>().GetFilesAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, searchInContent, withSubfolders).ToListAsync();
entries = entries.Concat(await fileSecurity.FilterReadAsync(files));
var files = _daoFactory.GetFileDao<T>().GetFilesAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, searchInContent, withSubfolders).ToListAsync();
var folders = _daoFactory.GetFolderDao<T>().GetFoldersAsync(parent.Id, orderBy, filter, subjectGroup, subjectId, searchText, withSubfolders).ToListAsync();
entries = entries.Concat(await fileSecurity.FilterReadAsync(await files));
entries = entries.Concat(await fileSecurity.FilterReadAsync(await folders));
if (filter == FilterType.None || filter == FilterType.FoldersOnly)
{