CompileAsyncQuery: SharpBoxTagDao
This commit is contained in:
parent
4f648b00b1
commit
b1c741a6d5
@ -48,30 +48,14 @@ internal class SharpBoxTagDao : SharpBoxDaoBase, IThirdPartyTagDao
|
|||||||
var folderId = DaoSelector.ConvertId(parentFolder.Id);
|
var folderId = DaoSelector.ConvertId(parentFolder.Id);
|
||||||
|
|
||||||
var filesDbContext = _dbContextFactory.CreateDbContext();
|
var filesDbContext = _dbContextFactory.CreateDbContext();
|
||||||
var entryIDs = await filesDbContext.ThirdpartyIdMapping
|
var entryIds = await Queries.HashIdsAsync(filesDbContext, PathPrefix).ToListAsync();
|
||||||
.Where(r => r.Id.StartsWith(PathPrefix))
|
|
||||||
.Select(r => r.HashId)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
if (!entryIDs.Any())
|
if (!entryIds.Any())
|
||||||
{
|
{
|
||||||
yield break;
|
yield break;
|
||||||
}
|
}
|
||||||
|
|
||||||
var q = from r in filesDbContext.Tag
|
var qList = await Queries.TagLinkTagPairAsync(filesDbContext, TenantID, entryIds, subject).ToListAsync();
|
||||||
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 tags = new List<Tag>();
|
var tags = new List<Tag>();
|
||||||
|
|
||||||
@ -79,13 +63,13 @@ internal class SharpBoxTagDao : SharpBoxDaoBase, IThirdPartyTagDao
|
|||||||
{
|
{
|
||||||
tags.Add(new Tag
|
tags.Add(new Tag
|
||||||
{
|
{
|
||||||
Name = r.tag.Name,
|
Name = r.Tag.Name,
|
||||||
Type = r.tag.Type,
|
Type = r.Tag.Type,
|
||||||
Owner = r.tag.Owner,
|
Owner = r.Tag.Owner,
|
||||||
EntryId = await MappingIDAsync(r.tagLink.EntryId),
|
EntryId = await MappingIDAsync(r.TagLink.EntryId),
|
||||||
EntryType = r.tagLink.EntryType,
|
EntryType = r.TagLink.EntryType,
|
||||||
Count = r.tagLink.Count,
|
Count = r.TagLink.Count,
|
||||||
Id = r.tag.Id
|
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());
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user