【问题标题】:LINQ - Add property to resultsLINQ - 将属性添加到结果
【发布时间】:2009-02-25 21:02:49
【问题描述】:

除了以下之外,还有其他方法可以向 Linq 查询结果的对象添加属性吗?

var query = from x in db.Courses
                select new
                {
                    x.OldProperty1,
                    x.OldProperty2,
                    x.OldProperty3,
                    NewProperty = true
                };

我想在不列出对象的所有当前属性的情况下执行此操作。有很多属性,我不想每次更改我的类时都必须更新此代码。

我仍在学习 LINQ,感谢您的建议。

【问题讨论】:

    标签: c# .net linq linq-to-sql


    【解决方案1】:

    添加部分类:

    public partial class Courses
    {
        public String NewProperty { get; set; }
    }
    

    然后您可以在创建对象后分配它。

    【讨论】:

    • 这是编译时间。问题不是要求运行时间,因此这不是问题的有效答案吗?
    • 当然,如果您要更改原始类设计(使其成为局部),您不妨继续添加属性...
    • 该类由 LINQ to SQL 生成。这是做到这一点的方法。我不知道为什么我没想到这样做!我以前做过。我觉得这叫脑屁。
    【解决方案2】:

    我想你可以返回一个由新属性和选定对象组成的新对象,如下所示:

    var query = from x in db.Courses
                    select new
                    {
                        Course = x,
                        NewProperty = true
                    };
    

    【讨论】:

    • 我真的在寻找一种将属性“注入”到我当前对象中的方法。不过谢谢!
    【解决方案3】:

    eking 的回答将是最直接的方法。

    如果这对您不起作用(因为您需要传递结果或其他什么),并且假设您正在处理的类已经定义了您要设置的属性,您可以创建一个复制构造函数或工厂采用现有实例加上您要设置的属性值的方法:

    var query = from x in db.Courses
                select new Course(x, valueOfNewProperty);
    

    或者,如果Course 没有定义该属性,您可以将其子类化并使用相同的方法:

    var query = from x in db.Courses
                select new CourseWithExtraProperty(x, valueOfNewProperty);
    

    (显然,为您的子类选择一个更好的名称)

    同样,除非您真的需要这样做,否则请坚持使用 eking 的解决方案。

    【讨论】:

      【解决方案4】:
      • ServiceStack 有一个 built-in way 来使用 PopulateWith 方法处理这个问题。

        • 这是code example

          foreach (var item in results)
          {
              var test1 = new ItemDto().PopulateWith(item);
              test1.extraField1 = "extra";
              response.Add(test1);
          }`
          
      • 如果您不使用 ServiceStack,您可以随时使用AutoMapper

        CreateMap<Foo, Bar>().ForMember(x => x.ExtraBarProperty, opt => opt.Ignore());

      【讨论】:

        【解决方案5】:

        如果您希望为对象动态添加属性,这可能是一个解决方案。

        这对我有用,我也有一个顾虑,就是那些具有许多属性的域对象所发生的事情,对象中任何更改的可维护性都是荒谬的,我做到了使用 LINQ - ExpandObject - Reflection 构建实现,这有助于保持我的对象动态,并且只添加我的视图逻辑所需的其他属性。

        var expandedModel = db.Courses.Select(x =>
                            {
                                dynamic expandObject = new ExpandoObject();
                                expandObject.NewProperty= $"PropertyValue";
                                foreach (var property in x.GetType().GetProperties())
                                {
                                    ((IDictionary<string, object>)expandObject).Add(property.Name, property.GetValue(x));
                                }
                                return expandObject;
                            }).ToList();
        

        【讨论】:

          猜你喜欢
          • 2018-07-17
          • 1970-01-01
          • 1970-01-01
          • 2016-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多