代码之家  ›  专栏  ›  技术社区  ›  CodeGrue

LINQ中带附加值的全对象投影

  •  7
  • CodeGrue  · 技术社区  · 15 年前

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

       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 回复  |  直到 15 年前
        1
  •  3
  •   JaredPar    15 年前

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

        2
  •  1
  •   Reed Copsey    15 年前

    如果将构造函数添加到 QuestionnaireVersionExtended 如果将实体加上NumberOfItems,则可以直接使用构造函数:

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

    但是,没有办法告诉编译器“只需显式地跨多个对象复制所有属性”

        3
  •  1
  •   Jerod Houghtelling    15 年前

    1.)重载一个构造函数并复制那里的所有值(然而,这正是您试图逃避的。

    2.)使用反射复制属性(许多不良副作用,不推荐)

    3.)使用装饰图案。看起来您为原始类添加了值,所以我认为这将是使用decorator的最佳时机。这也使得添加属性时不会遗漏它们。它会破坏编译,但是如果要修饰的对象是 sealed