#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 /…