Files
parr_api/PARR.DAL/Repositories/Unit/UnitRepository.cs
Mikhail Kuznetsov 343468cf71 feat(unitFilter): Оптимизация фильрации юнитов. Проверка значений аттрибутов теперь выполняется в 2 запроса:
- проверяем доступные в базе значения
- проверяем наличие значений в юнитах по id значений
2026-07-28 16:34:04 +10:00

51 lines
1.6 KiB
C#

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PARR.Core.Repositories.Interfaces.Unit;
using PARR.DAL.Context;
using PARR.DAL.Repositories.Base;
namespace PARR.DAL.Repositories.Unit
{
internal class UnitRepository : BaseRepository<Domain.Entities.Unit.Unit>, IUnitRepository
{
public UnitRepository(DataContext dataContext, ILogger<UnitRepository> logger) : base(logger, dataContext) { }
public IQueryable<Domain.Entities.Unit.Unit> GetWithIncludes()
{
return Get()
.Include(t => t.UnitValues)
.ThenInclude(t => t.Field)
.Include(t => t.UnitValues)
.ThenInclude(t => t.Value);
}
public IQueryable<Guid> GetInitialUnitIds(string dbValueMask)
{
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);
}
}
}