8

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

   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”属性?

4

3 回答 3

3

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

于 2010-06-24T19:58:53.817 回答
1

如果你添加一个构造函数来QuestionnaireVersionExtended获取你的实体加上 NumberOfItems,你可以直接使用构造函数:

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

然而,没有办法告诉编译器“只是显式地复制所有属性”。

于 2010-06-24T20:01:57.667 回答
1

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

1.) 重载一个构造函数并复制那里的所有值(但这就是你想要摆脱的。

2.)使用反射复制属性(很多不好的副作用,不推荐)

3.) 使用装饰模式。看起来您为原始类添加了值,所以我认为这将是使用装饰器的最佳时机。这也将使得在添加属性时不会错过它们。它会破坏编译,但是如果被装饰的对象是sealed.

于 2010-06-24T20:05:33.903 回答