From a86d256ef1e163eac4a799c3802df495ec9afc39 Mon Sep 17 00:00:00 2001 From: MaksimChegulov Date: Fri, 10 Feb 2023 11:40:31 +0300 Subject: [PATCH] Files: added precompiled query --- .../Core/Core/Dao/TeamlabDao/FolderDao.cs | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs index d9b5301c6a..ff2ff8b8e1 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs @@ -1340,25 +1340,7 @@ internal class FolderDao : AbstractDao, IFolderDao { var filesDbContext = _dbContextFactory.CreateDbContext(); - var originDates = Query(filesDbContext.TagLink).AsNoTracking() - .Where(l => entriesIds.Contains(Convert.ToInt32(l.EntryId))) - .Join(filesDbContext.Tag.AsNoTracking() - .Where(t => t.Type == TagType.Origin), l => l.TagId, t => t.Id, (l, t) => new { t.Name, t.Type, l.EntryType, l.EntryId }) - .GroupBy(r => r.Name, r => new { r.EntryId, r.EntryType }) - .Select(r => new OriginData - { - OriginRoom = filesDbContext.Folders.FirstOrDefault(f => f.TenantId == TenantID && - f.Id == filesDbContext.Tree.AsNoTracking() - .Where(t => t.FolderId == Convert.ToInt32(r.Key)) - .OrderByDescending(t => t.Level) - .Select(t => t.ParentId) - .Skip(1) - .FirstOrDefault()), - OriginFolder = filesDbContext.Folders.FirstOrDefault(f => f.TenantId == TenantID && f.Id == Convert.ToInt32(r.Key)), - Entries = r.Select(e => new KeyValuePair(e.EntryId, e.EntryType)).ToHashSet() - }); - - return originDates.AsAsyncEnumerable(); + return _getOriginsDataQuery(filesDbContext, entriesIds, TenantID); } #endregion @@ -1687,6 +1669,27 @@ internal class FolderDao : AbstractDao, IFolderDao }; } + private static readonly Func, int, IAsyncEnumerable> _getOriginsDataQuery = + Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery((FilesDbContext filesDbContext, IEnumerable entriesIds, int tenantId) => + filesDbContext.TagLink.AsNoTracking() + .Where(l => l.TenantId == tenantId) + .Where(l => entriesIds.Contains(Convert.ToInt32(l.EntryId))) + .Join(filesDbContext.Tag.AsNoTracking() + .Where(t => t.Type == TagType.Origin), l => l.TagId, t => t.Id, (l, t) => new { t.Name, t.Type, l.EntryType, l.EntryId }) + .GroupBy(r => r.Name, r => new { r.EntryId, r.EntryType }) + .Select(r => new OriginData + { + OriginRoom = filesDbContext.Folders.FirstOrDefault(f => f.TenantId == tenantId && + f.Id == filesDbContext.Tree.AsNoTracking() + .Where(t => t.FolderId == Convert.ToInt32(r.Key)) + .OrderByDescending(t => t.Level) + .Select(t => t.ParentId) + .Skip(1) + .FirstOrDefault()), + OriginFolder = filesDbContext.Folders.FirstOrDefault(f => f.TenantId == tenantId && f.Id == Convert.ToInt32(r.Key)), + Entries = r.Select(e => new KeyValuePair(e.EntryId, e.EntryType)).ToHashSet() + })); + private string GetProjectTitle(object folderID) { return "";