CompileAsyncQuery: SharpBoxTagDao

This commit is contained in:
Anton Suhorukov 2023-05-31 16:25:07 +03:00
parent 4f648b00b1
commit b1c741a6d5

View File

@ -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<Tag>();
@ -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<FilesDbContext, string, IAsyncEnumerable<string>> 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<FilesDbContext, int, IEnumerable<string>, Guid, IAsyncEnumerable<TagLinkTagPair>>
TagLinkTagPairAsync =
Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery(
(FilesDbContext ctx, int tenantId, IEnumerable<string> 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());
}