From b1c741a6d50c005fef0ff6e39d825cb984cedd67 Mon Sep 17 00:00:00 2001 From: Anton Sukhorukov Date: Wed, 31 May 2023 16:25:07 +0300 Subject: [PATCH] CompileAsyncQuery: SharpBoxTagDao --- .../Thirdparty/Sharpbox/SharpBoxTagDao.cs | 64 +++++++++++-------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxTagDao.cs b/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxTagDao.cs index a949aa814e..ab2e8f21d2 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxTagDao.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/Sharpbox/SharpBoxTagDao.cs @@ -48,30 +48,14 @@ internal class SharpBoxTagDao : SharpBoxDaoBase, IThirdPartyTagDao var folderId = DaoSelector.ConvertId(parentFolder.Id); var filesDbContext = _dbContextFactory.CreateDbContext(); - var entryIDs = await filesDbContext.ThirdpartyIdMapping - .Where(r => r.Id.StartsWith(PathPrefix)) - .Select(r => r.HashId) - .ToListAsync(); + var entryIds = await Queries.HashIdsAsync(filesDbContext, PathPrefix).ToListAsync(); - if (!entryIDs.Any()) + if (!entryIds.Any()) { yield break; } - var q = from r in filesDbContext.Tag - from l in filesDbContext.TagLink.Where(a => a.TenantId == r.TenantId && a.TagId == r.Id).DefaultIfEmpty() - where r.TenantId == TenantID && l.TenantId == TenantID && r.Type == TagType.New && entryIDs.Contains(l.EntryId) - select new { tag = r, tagLink = l }; - - if (subject != Guid.Empty) - { - q = q.Where(r => r.tag.Owner == subject); - } - - var qList = await q - .Distinct() - .AsAsyncEnumerable() - .ToListAsync(); + var qList = await Queries.TagLinkTagPairAsync(filesDbContext, TenantID, entryIds, subject).ToListAsync(); var tags = new List(); @@ -79,13 +63,13 @@ internal class SharpBoxTagDao : SharpBoxDaoBase, IThirdPartyTagDao { tags.Add(new Tag { - Name = r.tag.Name, - Type = r.tag.Type, - Owner = r.tag.Owner, - EntryId = await MappingIDAsync(r.tagLink.EntryId), - EntryType = r.tagLink.EntryType, - Count = r.tagLink.Count, - Id = r.tag.Id + Name = r.Tag.Name, + Type = r.Tag.Type, + Owner = r.Tag.Owner, + EntryId = await MappingIDAsync(r.TagLink.EntryId), + EntryType = r.TagLink.EntryType, + Count = r.TagLink.Count, + Id = r.Tag.Id }); } @@ -108,3 +92,31 @@ internal class SharpBoxTagDao : SharpBoxDaoBase, IThirdPartyTagDao } } } + +file class TagLinkTagPair +{ + public DbFilesTag Tag { get; set; } + public DbFilesTagLink TagLink { get; set; } +} + +static file class Queries +{ + public static readonly Func> HashIdsAsync = + Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery( + (FilesDbContext ctx, string idStart) => + ctx.ThirdpartyIdMapping + .Where(r => r.Id.StartsWith(idStart)) + .Select(r => r.HashId)); + + public static readonly Func, Guid, IAsyncEnumerable> + TagLinkTagPairAsync = + Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery( + (FilesDbContext ctx, int tenantId, IEnumerable entryIds, Guid owner) => + (from r in ctx.Tag + from l in ctx.TagLink.Where(a => a.TenantId == r.TenantId && a.TagId == r.Id).DefaultIfEmpty() + where r.TenantId == tenantId && l.TenantId == tenantId && r.Type == TagType.New && + entryIds.Contains(l.EntryId) + select new TagLinkTagPair { Tag = r, TagLink = l }) + .Where(r => owner != Guid.Empty && r.Tag.Owner == owner) + .Distinct()); +}