Я новичок в EF.Я пытаюсь заставить Entity Framework 4.2 выполнить сортировку по вычисляемому свойству (не сопоставленному).
Вот как выглядит моя сущность:
public class Site : Entity
{
public Site()
{
Equipments = new HashSet<Equipment>();
Forecasts = new HashSet<Forecast>();
}
[StringLength(8)]
public string Number { get; set; }
[StringLength(50)]
public string EquipmentShortCLLI { get; set; }
[StringLength(50)]
public string Location { get; set; }
public virtual Central Central { get; set; }
public virtual ICollection<Equipment> Equipments { get; set; }
public virtual ICollection<Forecast> Forecasts { get; set; }
#region Calculated Items
public bool IsEmbargo {
get { return Equipments.Count > 0 && Equipments.SelectMany(x => x.EquipmentDetails).Any(e => e.IsEmbargo); }
}
//...
public int PortsCapacity
{
get
{
return Equipments.Count > 0
? Equipments.SelectMany(x => x.Slots).Sum(x => x.PortsCapacity)
: 0;
}
}
#endregion
//...
При попытке заказа с использованием любогоиз моих свойств только для чтения я получаю исключение: указанный элемент типа 'PortsCapacity' не поддерживается в LINQ to Entities.Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей.
Это имеет смысл, потому что EF пытается построить порядок SQL с полем, которое не существует в базе данных (мое понимание ..).
Теперь, используя некоторый динамический код linq , я смог выполнить эту работу для моих столбцов "многие к одному", передав "Central.SomeField" (в отличие от создания свойства ReadOnly, которое возвращаетCentral.SomeField).IE:
query.OrderBy("Central.SomeField");
Однако, я все еще сталкиваюсь с той же проблемой, когда дело доходит до коллекции предметов (Equipments).Я пытаюсь сделать это как можно более динамичным, используя строку, исходящую со стороны клиента, и избегая длинного случая переключения, но на этом этапе я приму любые идеи, пока сортировка происходит на стороне базы данных .
Редактировать 1:
В соответствии с тем, что говорит Ладислав Мрнка, как можно выполнить предложение OrderBy для дочерних элементов «один ко многим», используя лямбды или выражения?