Динамическое выражение для упорядочения дочерних коллекций с Entity Framework - PullRequest
0 голосов
/ 21 ноября 2011

Я новичок в 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 для дочерних элементов «один ко многим», используя лямбды или выражения?

1 Ответ

0 голосов
/ 22 ноября 2011

Я не думаю, что Dynamic Linq способен на это.Вам нужен настоящий подзапрос Linq для вычисления агрегатов на Equipements, поэтому он просто не будет работать.Если пользователь выбирает порядок по IsEmbargo или PortsCapacity, у вас должен быть какой-то блок switch / if, чтобы обработать этот случай путем добавления специальной части запроса - иным способом.

...