LINQ - Добавить свойство к результатам - PullRequest
12 голосов
/ 26 февраля 2009

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 26 февраля 2009

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

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

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

6 голосов
/ 26 февраля 2009

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

var query = from x in db.Courses
                select new
                {
                    Course x,
                    NewProperty = true
                };
5 голосов
/ 26 февраля 2009

Ответ Экинга будет самым простым подходом.

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

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.

1 голос
/ 06 октября 2015
  • 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());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...