Подтвердить что ты не робот

LINQ - добавление свойства к результатам

Есть ли способ добавить свойство к объектам результата запроса Linq, отличным от следующего?

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

Я хочу сделать это без указания всех текущих свойств моего объекта. Есть много свойств, и я не хочу обновлять этот код всякий раз, когда я могу изменить свой класс.

Я все еще участвую в LINQ, и я ценю ваши предложения.

4b9b3361

Ответ 1

Добавьте его с частичными классами:

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

Затем вы можете назначить его после создания объекта.

Ответ 2

Предположим, вы могли бы вернуть новый объект, состоящий из нового свойства и выбранного объекта, например:

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

Ответ 3

eking ответ будет самым простым способом.

Если это не работает для вас (потому что вам нужно передать результаты вокруг или что-то еще), и если класс, с которым вы имеете дело, уже определяет свойство, которое вы хотите установить, вы можете создать конструктор копирования или factory, который принимает существующий экземпляр плюс значение свойства, которое вы хотите установить:

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 имеет встроенный способ для обработки этого с помощью метода PopulateWith.

    • Вот пример .

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