feat(unitFilter): Оптимизация фильрации юнитов. Проверка значений аттрибутов теперь выполняется в 2 запроса:
- проверяем доступные в базе значения - проверяем наличие значений в юнитах по id значений
This commit is contained in:
@@ -11,16 +11,18 @@ namespace PARR.DAL.Repositories.Unit
|
||||
{
|
||||
public UnitFieldValueRepository(DataContext dataContext, ILogger<UnitFieldValueRepository> logger) : base(logger, dataContext) { }
|
||||
|
||||
|
||||
public async Task<UnitFieldValue?> GetByValueNameAsync(string? value)
|
||||
public async Task<List<Guid>> FindValueIdsByMaskAsync(
|
||||
string mask,
|
||||
CancellationToken ct = default)
|
||||
{
|
||||
var query = EntitySet
|
||||
.Include(v => v.FieldValues);
|
||||
var query = EntitySet.AsNoTracking();
|
||||
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
return await query.FirstOrDefaultAsync(uf => uf.Value == null);
|
||||
var valueIds = await query
|
||||
.Where(v => EF.Functions.ILike(v.Value!, mask))
|
||||
.Select(v => v.Id)
|
||||
.ToListAsync(ct);
|
||||
|
||||
return await query.FirstOrDefaultAsync(uf => uf.Value!.ToLower().Trim() == value.ToLower().Trim());
|
||||
return valueIds;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user