Полная проекция объекта с дополнительными значениями в LINQ - PullRequest
7 голосов
/ 24 июня 2010

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

   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?

Ответы [ 3 ]

3 голосов
/ 24 июня 2010

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

1 голос
/ 25 июня 2010

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

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

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

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

1 голос
/ 25 июня 2010

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

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

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

...