Мне нужно создать фильтр, сортирующий товары по производителю, материалу (WarehouseItemDefinition), дате лота, цвету и качеству.
Пока что Я сделал фильтр, чтобы вернуть коллекцию WarehouseItemDtos.
Мой класс warehouseItem:
public class WarehouseItem : AuditEntity<long>
{
[ForeignKey("WarehouseItemDefinition")]
public long WarehouseItemDefinitionId { get; set; }
public virtual WarehouseItemDefinition WarehouseItemDefinition { get; set; }
[ForeignKey("Quality")]
public long QualityId { get; set; }
public virtual Quality Quality { get; set; }
public DateTime LotDate { get; set; }
public bool IsWastage { get; set; }
[DoNotMap]
public int Width { get; set; }
[DoNotMap]
public int Height { get; set; }
[DoNotMap]
public int Length { get; set; }
[NotMapped]
public string Barcode { get => $"6{Id:D7}"; }
public virtual List<WarehouseSubItem> Parts { get; set; }
}
Мой storeitemdto:
public class WarehouseItemDto : IEntityDto<long>
{
public long Id { get; set; }
public long ManufacturerId { get; set; }
public long WarehouseItemDefinitionId { get; set; }
public DateTime LotDate { get; set; }
public bool IsWastage { get; set; }
public List<int> Width { get; set; } = new List<int>();
public List<int> Height { get; set; } = new List<int>();
public List<int> Length { get; set; } = new List<int>();
public long Quality { get; set; }
}
FilterDto:
public class WarehouseItemFilterDto
{
public long? ManufacturerId { get; set; }
public string ManufacturerName { get; set; }
public long? WarehouseItemDefinitionId { get; set; }
public string WarehouseItemDefinitionName { get; set; }
public string Color { get; set; }
public long? QualityId { get; set; }
public DateTime LotDate { get; set; }
}
и мой метод фильтрации:
public IEnumerable<WarehouseItemDto> GetAllFiltered(WarehouseItemFilterDto filterDto)
{
var list = this.repository.GetAll();
if (filterDto.ManufacturerName != null)
{
list = list.Where(l => l.WarehouseItemDefinition.Manufacturer.Name == filterDto.ManufacturerName);
}
if (filterDto.ManufacturerId != null)
{
list = list.Where(l => l.WarehouseItemDefinition.Manufacturer.Id == filterDto.ManufacturerId);
}
if (filterDto.WarehouseItemDefinitionName != null)
{
list = list.Where(l => l.WarehouseItemDefinition.Name == filterDto.WarehouseItemDefinitionName);
}
if (filterDto.WarehouseItemDefinitionId != null)
{
list = list.Where(l => l.WarehouseItemDefinitionId == filterDto.WarehouseItemDefinitionId);
}
if (filterDto.Color != null)
{
list = list.Where(l => l.WarehouseItemDefinition.Color.ToString() == filterDto.Color);
}
if (filterDto.QualityId != null)
{
list = list.Where(l => l.QualityId == filterDto.QualityId);
}
if (filterDto.LotDate != default)
{
list = list.Where(l => l.LotDate.CompareTo(filterDto.LotDate) > 0);
}
var result = list.Select(m => mapper.Map<WarehouseItemDto>(m));
return result;
}
Мне нужно вернуть Массив производителей, который содержит Массив WhItemDefinitions, который содержит элементы Массива складов, чтобы их можно было отображать.
Как я могу сгруппировать эти элементы хранилища по производителю, а затем по WHItemDefinition? DTO возвращает только ManufacturerId и WhItemDefinitionID, это означает, что мне нужен еще один запрос к базе данных, чтобы получить имена каждого из них.
Я думал о WarehouseFilterResultDto: string ManufacturerName, List
WarehouseItemDefinitionFilterDto, чтобы иметь: string WarehouseItemDefinitionName, List
для полного выполнения требований. Моя единственная проблема - это группировка.