LINQ - 向结果添加属性

时间:2009-02-25 21:02:50

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

有没有办法将属性添加到除以下内容之外的Linq查询结果的对象中?

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

我想这样做而不列出我对象的所有当前属性。有许多属性,我不想在我改变课程时更新此代码。

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

5 个答案:

答案 0 :(得分:7)

使用部分类添加它:

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

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的解决方案。

答案 3 :(得分:1)

  • 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());

答案 4 :(得分:0)

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

这对我有用,我也有一个担忧,那就是那些具有许多属性的领域对象发生了什么,该对象中任何更改的可维护性都是荒谬的,我设法用 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();