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指出的,列出属性是我试图避免的,因为有很多属性。