C# 在LINQ中具有附加值的完整对象投影

C# 在LINQ中具有附加值的完整对象投影,c#,linq,projection,C#,Linq,Projection,是否可以投影对象的每个属性并添加更多属性,而不具体列出所有属性。例如,不要这样做: var projection = from e in context.entities select new QuestionnaireVersionExtended { Id = e.Id, Version = e.Version,

是否可以投影对象的每个属性并添加更多属性,而不具体列出所有属性。例如,不要这样做:

   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属性添加到该属性上?

否这是不可能的。LINQ表达式的select子句允许生成值的普通C表达式。没有一个C构造会像这样通过对象初始值设定项以模板样式的方式创建对象。您需要列出属性或使用显式构造函数。

如果您向QuestionNaReversionExtended添加了一个构造函数,该构造函数接受您的实体和NumberOfItems,您可以直接使用该构造函数:

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

但是,没有办法告诉编译器只需显式复制所有属性。

有几种方法可以实现这一点,但它们都将是噩梦

一,。重载构造函数并将所有值复制到那里,但这正是您试图避免的

二,。使用反射复制属性会产生许多不良副作用,不推荐使用


三,。使用装饰图案。看起来您为原始类添加了值,所以我认为这是使用装饰器的最佳时机。这也使得添加属性时不会遗漏属性。它会破坏编译,但是如果要装饰的对象是密封的,这个解决方案就不是完美的。

那太好了。。。然而,我会写一些像e.*的东西,而不仅仅是e。这对于匿名类型尤其有用,正如Jarod指出的,列出属性是我试图避免的,因为有很多属性。