feat(unitFilter): Оптимизация фильрации юнитов. Проверка значений аттрибутов теперь выполняется в 2 запроса:

- проверяем доступные в базе значения
- проверяем наличие значений в юнитах по id значений
This commit is contained in:
Mikhail Kuznetsov
2026-07-28 16:34:04 +10:00
parent 556d895c7c
commit 343468cf71
11 changed files with 1529 additions and 281 deletions

View File

@@ -11,7 +11,6 @@ namespace PARR.DAL.Repositories.Unit
{
public UnitRepository(DataContext dataContext, ILogger<UnitRepository> logger) : base(logger, dataContext) { }
public IQueryable<Domain.Entities.Unit.Unit> GetWithIncludes()
{
return Get()
@@ -22,40 +21,30 @@ namespace PARR.DAL.Repositories.Unit
}
public IQueryable<Domain.Entities.Unit.Unit> GetUnitByFieldAndValue(IQueryable<Domain.Entities.Unit.Unit> query, Guid fieldId, string valueMask, bool isInverse = false)
{
//TODO: вынесено из UnitFilterService
if (isInverse)
{
query = query.Where(u => !u.UnitValues.Any(v =>
v.FieldId == fieldId &&
EF.Functions.ILike(v.Value.Value, valueMask)));
}
else
{
query = query.Where(u => u.UnitValues.Any(v =>
v.FieldId == fieldId &&
EF.Functions.ILike(v.Value.Value, valueMask)));
}
return query;
}
public IQueryable<Guid> GetInitialUnitIds(string dbValueMask)
{
//TODO: вынесено из UnitFilterService
//var initialUnitIds = await unitService.Get().AsNoTracking()
//.Where(unit => EF.Functions.ILike(unit.Name, dbValueMask))
//.Select(u => u.Id)
//.ToListAsync(cancellationToken);
return Get().AsNoTracking()
.Where(unit => EF.Functions.ILike(unit.Name, dbValueMask))
.Select(u => u.Id);
}
public async Task<List<Guid>> FindUnitIdsByValueIdsAsync(
IReadOnlyList<Guid> unitIds,
Guid fieldId,
IReadOnlyList<Guid> valueIds,
CancellationToken ct = default)
{
if (valueIds.Count == 0)
return new List<Guid>();
return await EntitySet.AsNoTracking()
.Where(u => unitIds.Contains(u.Id))
.Where(u => u.UnitValues.Any(uv =>
uv.FieldId == fieldId &&
valueIds.Contains(uv.ValueId)))
.Select(u => u.Id)
.ToListAsync(ct);
}
}
}