Полная объектная проекция с дополнительными значениями в LINQ

Действительно ли возможно спроектировать каждое свойство объекта и добавить больше, конкретно не перечисляя их всех. Например, вместо того, чтобы делать это:

   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" на это?

7
задан JaredPar 24 June 2010 в 19:59
поделиться

3 ответа

Нет, это невозможно. Пункт select в выражении LINQ позволяет использовать обычные выражения C#, которые выдают значение. Не существует конструкции C#, которая создаст объект через инициализатор объекта в шаблонном стиле, как в этом случае. Вам придется либо перечислить свойства, либо использовать явный конструктор.

3
ответ дан 7 December 2019 в 12:14
поделиться

Если вы добавите в QuestionnaireVersionExtended конструктор, который принимает вашу сущность плюс NumberOfItems, вы можете использовать конструктор напрямую:

var projection = from e in context.entities
     select new QuestionnaireVersionExtended(e, NumberOfItems = (e.Children.Count()));

Однако нет способа сказать компилятору «просто скопируйте все свойства в явном виде. "

1
ответ дан 7 December 2019 в 12:14
поделиться

Есть несколько способов, которыми вы могли бы достичь этого, но все они будут кошмарными.

1.) Перегрузить конструктор и скопировать все значения туда (однако это то, от чего вы пытаетесь уйти.

2.) Использовать отражение для копирования свойств (много плохих побочных эффектов, не рекомендуется)

3.) ИСПОЛЬЗОВАТЬ ПАТТЕРН ДЕКОРАТОРА. Похоже, что вы добавили значения в исходный класс, поэтому я думаю, что это идеальное время для использования декоратора. Это также сделает так, что при добавлении свойств они не будут пропущены. Это нарушит компиляцию, однако это решение не будет идеальным, если декорируемый объект sealed.

1
ответ дан 7 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: