CompileAsyncQuery: SharpBoxFileDao

This commit is contained in:
Anton Suhorukov 2023-05-31 14:49:08 +03:00
parent 488ba4c8fb
commit b1eec9510b

View File

@ -387,46 +387,31 @@ internal class SharpBoxFileDao : SharpBoxDaoBase, IFileDao<string>
using var filesDbContext = _dbContextFactory.CreateDbContext();
using (var tx = await filesDbContext.Database.BeginTransactionAsync())
{
var hashIDs = await Query(filesDbContext.ThirdpartyIdMapping)
.Where(r => r.Id.StartsWith(id))
.Select(r => r.HashId)
.ToListAsync()
;
var hashIds = await Queries.HashIdsAsync(filesDbContext, TenantID, id).ToListAsync();
var link = await Query(filesDbContext.TagLink)
.Where(r => hashIDs.Any(h => h == r.EntryId))
.ToListAsync()
;
var links = await Queries.TagLinksAsync(filesDbContext, TenantID, hashIds).ToListAsync();
filesDbContext.TagLink.RemoveRange(link);
filesDbContext.TagLink.RemoveRange(links);
await filesDbContext.SaveChangesAsync();
var tagsToRemove = from ft in filesDbContext.Tag
join ftl in filesDbContext.TagLink.DefaultIfEmpty() on new { TenantId = ft.TenantId, Id = ft.Id } equals new { TenantId = ftl.TenantId, Id = ftl.TagId }
where ftl == null
select ft;
var tagsToRemove = await Queries.TagsAsync(filesDbContext).ToListAsync();
filesDbContext.Tag.RemoveRange(await tagsToRemove.ToListAsync());
filesDbContext.Tag.RemoveRange(tagsToRemove);
var securityToDelete = Query(filesDbContext.Security)
.Where(r => hashIDs.Any(h => h == r.EntryId));
var securityToDelete = await Queries.SecuritiesAsync(filesDbContext, TenantID, hashIds).ToListAsync();
filesDbContext.Security.RemoveRange(await securityToDelete.ToListAsync());
filesDbContext.Security.RemoveRange(securityToDelete);
await filesDbContext.SaveChangesAsync();
var mappingToDelete = Query(filesDbContext.ThirdpartyIdMapping)
.Where(r => hashIDs.Any(h => h == r.HashId));
var mappingToDelete = await Queries.ThirdpartyIdMappingsAsync(filesDbContext, TenantID, hashIds).ToListAsync();
filesDbContext.ThirdpartyIdMapping.RemoveRange(await mappingToDelete.ToListAsync());
filesDbContext.ThirdpartyIdMapping.RemoveRange(mappingToDelete);
await filesDbContext.SaveChangesAsync();
await tx.CommitAsync();
}
});
if (file is not ErrorEntry)
{
SharpBoxProviderInfo.Storage.DeleteFileSystemEntry(file);
@ -734,3 +719,46 @@ internal class SharpBoxFileDao : SharpBoxDaoBase, IFileDao<string>
}
#endregion
}
static file class Queries
{
public static readonly Func<FilesDbContext, int, string, IAsyncEnumerable<string>> HashIdsAsync =
Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery(
(FilesDbContext ctx, int tenantId, string idStart) =>
ctx.ThirdpartyIdMapping
.Where(r => r.TenantId == tenantId)
.Where(r => r.Id.StartsWith(idStart))
.Select(r => r.HashId));
public static readonly Func<FilesDbContext, int, IEnumerable<string>, IAsyncEnumerable<DbFilesTagLink>>
TagLinksAsync = Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery(
(FilesDbContext ctx, int tenantId, IEnumerable<string> hashIds) =>
ctx.TagLink
.Where(r => r.TenantId == tenantId)
.Where(r => hashIds.Any(h => h == r.EntryId)));
public static readonly Func<FilesDbContext, IAsyncEnumerable<DbFilesTag>> TagsAsync =
Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery(
(FilesDbContext ctx) =>
from ft in ctx.Tag
join ftl in ctx.TagLink.DefaultIfEmpty() on new { TenantId = ft.TenantId, Id = ft.Id } equals new
{
TenantId = ftl.TenantId, Id = ftl.TagId
}
where ftl == null
select ft);
public static readonly Func<FilesDbContext, int, IEnumerable<string>, IAsyncEnumerable<DbFilesSecurity>> SecuritiesAsync =
Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery(
(FilesDbContext ctx,int tenantId, IEnumerable<string> hashIds) =>
ctx.Security
.Where(r => r.TenantId == tenantId)
.Where(r => hashIds.Any(h => h == r.EntryId)));
public static readonly Func<FilesDbContext, int, IEnumerable<string>, IAsyncEnumerable<DbFilesThirdpartyIdMapping>> ThirdpartyIdMappingsAsync =
Microsoft.EntityFrameworkCore.EF.CompileAsyncQuery(
(FilesDbContext ctx,int tenantId, IEnumerable<string> hashIds) =>
ctx.ThirdpartyIdMapping
.Where(r => r.TenantId == tenantId)
.Where(r => hashIds.Any(h => h == r.HashId)));
}