CompileAsyncQuery: SharpBoxFileDao
This commit is contained in:
parent
488ba4c8fb
commit
b1eec9510b
@ -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)));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user