Сортировка основного списка по свойству подсписка в LINQ

#c# #entity-framework #linq

#c# #entity-framework #linq

Вопрос:

В настоящее время у меня следующая структура моих классов:

  public class StoreElement
{
    [Display(Name="ID")]
    public int StoreElementId { get; set; }

    [Display(Name = "RegalID")]
    public string StoreElementCode { get; set; }

    [Display(Name = "Regal")]
    public string Storage { get; set; }

    [Display(Name="Ebene")]
    public string Level { get; set; }

    [Display(Name = "Fach")]
    public string Shelf { get; set; }

    [Display(Name = "ESL Tag")]
    public string ESLTagId { get; set; }

    [Display(Name ="ESL Layout Template")]
    public string ESLLayoutValue { get; set; }

    [Display(Name = "Eingelagertes Material")]
    public List<Material> Materials { get; set; }
 

}

И этот класс:

     public class Material
{
    [Display(Name = "ID")]
    public int MaterialId { get; set; }

    [Display(Name = "Materialnummer")]
    public int? MaterialNumber { get; set; }

    [Display(Name = "Auftragsnummer")]
    public int? OrderNumber { get; set; }

    [Display(Name = "Eingelagert")]
    public bool? IsStored { get; set; }

    [Display(Name = "Einlagerdatum")]
    public DateTime StoredAt { get; set; }

    [Display(Name = "Auslagerdatum")]
    public DateTime OutsourcedAt { get; set; }

    [Display(Name = "Liefertermin")]
    public DateTime DeliveryDate { get; set; }

    [Display(Name = "Priorisiertes Material")]
    public bool PriorityMaterial { get; set; }



    public int? StoreElementId { get; set; }
    public StoreElement StoreElement { get; set; }
}
 

Элемент StoreElement может содержать список материалов. Класс Materials содержит свойство, которое является датой. Теперь я хотел бы упорядочить список местоположений хранилища по дате субсобственности списка материалов.

Я пробовал что-то подобное в linq:

 var myOrderdStorageLocationsByDeliveryDateOfMaterialsSublist = this.MyDatabaseContext.StorageLocations.Include(x=>x.Materials).OrderBy(x=>x.Materials.OrderBy(y=>y.DeliveryDate)).ToList();
 

Но это вызывает исключение, в котором говорится: «Не удалось сравнить два элемента в массиве»

Комментарии:

1. Можете ли вы привести пример порядка, насколько точно вы этого хотите, например. Элемент A (с материалами cba), затем элемент B (с материалом cde)

2. Значение какой даты Materials вы хотите использовать для упорядочения? Какую ссылку на EF вы используете: EF 6.x / EF Core 2.0 / 2.1 / 3 .x / 5.x?

Ответ №1:

Очевидно, вам нужна некоторая ценность от материалов. И OrderBy не вернет его. Я бы рекомендовал вам получить определенное значение для сортировки StoreElements на основе того, какая логика вам нужна: Min , Max или Average , например.

 var myOrderdStorageLocationsByDeliveryDateOfMaterialsSublist = this.MyDatabaseContext.StorageLocations
.Include(x=>x.Materials)
.OrderBy(x=>x.Materials.Min(y=>y.DeliveryDate))
.ToList();
 

Комментарии:

1. Не могли бы вы объяснить это более подробно? Почему я должен использовать Min? Я хотел бы упорядочить основной список мест хранения по свойству подсписка материалов. Если я попробую это, как вы сказали, я получу это исключение «»Ссылка на объект не установлена для экземпляра объекта».

2. Поскольку вам нужно какое-то конкретное значение свойства, которое вы хотели бы использовать. В противном случае, в вашем случае, он пытается выполнить сортировку по значению массива, потому что внутренний OrderBy вернет его. И он не знает, как сравнить два элемента, которые являются массивами.

3. Или вы должны передать свой собственный компаратор в качестве третьего аргумента в верхний OrderBy docs.microsoft.com/en-us/dotnet/api /…