Этот вопрос главным образом связан с LINQ и, возможно, ковариацией.Объединение нескольких классов, Сортировка по общему интерфейсу
Два из моих сущностей реализуют интерфейс IDatedItem. Я хотел бы объединиться, а затем отсортировать их для перечисления в виде единого списка. Я должен сохранить свойства, специфичные для сущности, во время перечисления.
Чтобы уточнить пример, один подход, который я попытался было:
Context.Table1.Cast<IDatedItem>().
Union(Context.Table2.Cast<IDatedItem>()).
SortBy(i => i.Date).
ForEach(u => CustomRenderSelector(u, u is Table1));
В попытке сделать это различными способами, я столкнулся с различными ошибками.
- LINQ to Entities поддерживает только типы примитивов EDM или перечисления.
- Невозможно обработать тип .IDatedItem [] ', неизвестное сопоставление уровня значений
- Невозможно создать постоянное значение типа' IDatedItem '. Только примитивные типы
- т.д.
Большая картина:
- Интерфейс IDatedItem, показанный здесь, упрощение реальных общих свойств.
- На практике таблицы фильтруются перед объединением.
- Объектно-ориентированные свойства будут отображаться, по порядку, на веб-странице.
- В параллельной функции они будут сериализованы в иерархию результатов JSON.
- Я хотел бы иметь возможность выполнять агрегированные операции LINQ с результатами.
Почему бы не «класс»? Я думаю, что все сопоставления выполняются автоматически, поэтому нам не нужно заботиться о классе или интерфейсе. –
Вы имеете в виду классовое наследование, а не интерфейс, например, реализацию EF в таблице для каждого типа? Ну, вообще говоря, этот интерфейс действительно плохое первичное представление сущностей. Вы можете спросить, в чем проблема. Интерфейс, который мы обсуждаем, специфичен для одного набора представлений в моем приложении. Так как класс в C# может иметь только один непосредственный базовый класс, это означает, что я не мог решить такую проблему для других представлений одинаково. – shannon
Вы можете сделать это только в том случае, если вы выполняете 'AsEnumerable' перед трансляцией. Но тогда вы не можете «Union», если вы сначала не проецируете один класс, а Sort - на клиентскую сторону. Между скалой и твердым местом ... –