Создать фильтр, который возвращает Массив массива элементов - PullRequest
1 голос
/ 29 апреля 2020

Мне нужно создать фильтр, сортирующий товары по производителю, материалу (WarehouseItemDefinition), дате лота, цвету и качеству.

enter image description here

Пока что Я сделал фильтр, чтобы вернуть коллекцию 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

для полного выполнения требований. Моя единственная проблема - это группировка.

...