Действительно ли возможно спроектировать каждое свойство объекта и добавить больше, конкретно не перечисляя их всех. Например, вместо того, чтобы делать это:
var projection = from e in context.entities
select new QuestionnaireVersionExtended
{
Id = e.Id,
Version = e.Version,
CreationDate = e.CreationDate,
...
many more properties
...
NumberOfItems = (e.Children.Count())
};
Можем мы делать что-то вроде этого:
var projection = from e in context.entities
select new QuestionnaireVersionExtended
{
e,
NumberOfItems = (e.Children.Count())
};
Где это возьмет каждое свойство от e с тем же именем и добавит свойство "NumberOfItems" на это?
Нет, это невозможно. Пункт select в выражении LINQ позволяет использовать обычные выражения C#, которые выдают значение. Не существует конструкции C#, которая создаст объект через инициализатор объекта в шаблонном стиле, как в этом случае. Вам придется либо перечислить свойства, либо использовать явный конструктор.
Если вы добавите в QuestionnaireVersionExtended
конструктор, который принимает вашу сущность плюс NumberOfItems, вы можете использовать конструктор напрямую:
var projection = from e in context.entities
select new QuestionnaireVersionExtended(e, NumberOfItems = (e.Children.Count()));
Однако нет способа сказать компилятору «просто скопируйте все свойства в явном виде. "
Есть несколько способов, которыми вы могли бы достичь этого, но все они будут кошмарными.
1.) Перегрузить конструктор и скопировать все значения туда (однако это то, от чего вы пытаетесь уйти.
2.) Использовать отражение для копирования свойств (много плохих побочных эффектов, не рекомендуется)
3.) ИСПОЛЬЗОВАТЬ ПАТТЕРН ДЕКОРАТОРА. Похоже, что вы добавили значения в исходный класс, поэтому я думаю, что это идеальное время для использования декоратора. Это также сделает так, что при добавлении свойств они не будут пропущены. Это нарушит компиляцию, однако это решение не будет идеальным, если декорируемый объект sealed
.